Cách thích hợp để kiểm tra xem một chuỗi trống trong Perl là gì?


94

Tôi vừa sử dụng mã này để kiểm tra xem một chuỗi có trống không:

if ($str == "")
{
  // ...
}

Và cũng tương tự với toán tử not = ...

if ($str != "")
{
  // ...
}

Điều này có vẻ hiệu quả (tôi nghĩ vậy), nhưng tôi không chắc đó là cách chính xác, hoặc nếu có bất kỳ nhược điểm nào không lường trước được. Có điều gì đó không ổn về nó.

Câu trả lời:


133

Để so sánh chuỗi trong Perl, hãy sử dụng eqhoặc ne:

if ($str eq "")
{
  // ...
}

Các ==!=khai thác được số toán tử so sánh. Họ sẽ cố gắng chuyển đổi cả hai toán hạng thành số nguyên trước khi so sánh chúng.

Xem trang người đàn ông perlop để biết thêm thông tin.


Đúng vậy, sử dụng điều này mặc dù bạn cần phải thận trọng rằng nếu nó là undef và nếu bạn đang sử dụng cảnh báo, bạn sẽ nhận được cảnh báo thời gian chạy. Mặc dù vậy, có nhiều cách để vượt qua cảnh báo.
Evan Carroll

89
  1. Do cách mà các chuỗi được lưu trữ trong Perl, việc tối ưu hóa độ dài của một chuỗi.
    if (length $str)là một cách tốt để kiểm tra xem một chuỗi có trống không.

  2. Nếu bạn đang ở trong một tình huống mà bạn chưa đề phòng undef, thì giải pháp bắt tất cả cho "không trống" sẽ không cảnh báo là if (defined $str and length $str).


6
Tôi nghĩ rằng độ dài là bài kiểm tra gần nhất mà chúng ta có để thể hiện ý tưởng rằng không có gì trong chuỗi.
brian d foy

6
Được ủng hộ vì đây if (length($str))là một cách tiếp cận tốt và không thất bại nếu biến không được xác định.
6

10

Bạn có thể muốn sử dụng "eq" thay vì "==". Nếu bạn lo lắng về một số trường hợp cạnh, bạn cũng có thể muốn kiểm tra xem chưa xác định:

if (not defined $str) {

# this variable is undefined

}

1
Rất hữu ích khi bạn lấy được chuỗi bằng cách dịch chuyển một mảng có thể có 0 phần tử.
Dacav 13/11/11

9

Như đã được đề cập bởi một số người, eqlà nhà điều hành phù hợp ở đây.

Nếu bạn use warnings;ở trong tập lệnh của mình, bạn sẽ nhận được cảnh báo về điều này (và nhiều điều hữu ích khác); Tôi cũng muốn giới thiệu use strict;.


+1 Tuyệt, vâng, tôi thường sử dụng use strictnhưng tôi đang cập nhật một số mã cũ, vì vậy khi tôi thêm mã này, tôi gặp hàng trăm lỗi. Có lẽ tôi sẽ sửa chúng vào một ngày nào đó.
Nick Bolton

4

Khái niệm về một cách "thích hợp" để làm bất cứ điều gì, ngoài việc sử dụng CPAN, không tồn tại ở Perl.

Dù sao thì đó cũng là toán tử số, bạn nên sử dụng

if($foo eq "")

hoặc là

if(length($foo) == 0)

3
Đúng là Perl không có xu hướng ủng hộ "một cách đúng đắn" để giải quyết vấn đề, nhưng điều đó không có nghĩa là không có thành ngữ và phong cách và cách tiếp cận được ưa thích nhất. Ngoài ra, vì một trong những người theo quy định Perl thích nói rất nhiều, ngay cả khi có nhiều cách để làm mọi việc, một số cách để thực hiện mọi việc thực sự rất tệ (ngu ngốc, không khéo léo, khó bảo trì, v.v. .)
Telemachus

2
Chỉ vì có nhiều cách để làm điều đó không có nghĩa là tất cả các cách đều bình đẳng. if ($foo == "")Ví dụ: kiểm tra các chuỗi trống bằng cách sử dụng , rõ ràngsai trừ khi bạn thực sự muốn kiểm tra xem $foo, được đánh giá trong ngữ cảnh số, có giá trị 0 hay không (trong trường hợp đó, nó vẫn sẽ được viết tốt hơn if ($foo == 0), vì điều đó thể hiện rõ ràng hơn ý định).
Dave Sherohman

0

Để kiểm tra một chuỗi trống, bạn cũng có thể làm như sau

if (!defined $val || $val eq '')
{
    # empty
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.