Câu hỏi Cách thích hợp để kiểm tra xem một chuỗi có rỗng trong Perl không?


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 giống với toán tử không bằng ...

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

Điều này dường như làm việc (tôi nghĩ), nhưng tôi không chắc chắn đó là cách chính xác, hoặc nếu có bất kỳ hạn chế không lường trước được. Một cái gì đó chỉ không cảm thấy đúng về nó.


76
2018-01-11 23:16


gốc




Các câu trả lời:


Để so sánh chuỗi trong Perl, sử dụng eq hoặc là ne:

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

Các == và != toán tử là 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 perlop trang người đàn ông để biết thêm thông tin.


111
2018-01-11 23:20



Yea, 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 một cảnh báo thời gian chạy. Nhiều cách để tránh xung đột cảnh báo. - Evan Carroll


  1. Do cách mà chuỗi được lưu trữ trong Perl, nhận được độ dài của một chuỗi được tối ưu hóa.
    if (length $str) là một cách hay để 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 bảo vệ chống lại undef, sau đó là toàn bộ nội dung "không trống" sẽ không cảnh báo if (defined $str and length $str).


84
2018-01-11 23:57



Tôi nghĩ rằng chiều dài là thử nghiệm gần nhất mà chúng ta phải biểu hiện ý tưởng rằng không có gì trong chuỗi. - brian d foy
Được thăng hạng vì if (length($str)) là một cách tiếp cận tốt đẹp và không thất bại nếu biến không được xác định. - basic6


Như đã được đề cập bởi nhiều người, eq là toán tử đúng ở đây.

nếu bạn use warnings; trong kịch bản của bạn, bạn sẽ nhận được cảnh báo về điều này (và nhiều thứ hữu ích khác); Tôi khuyên bạn nên use strict; cũng.


9
2018-01-11 23:27



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


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 không xác định:

if (not defined $str) {

# this variable is undefined

}

9
2018-01-11 23:23



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


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 trong Perl.

Dù sao đó là những toán tử số, bạn nên sử dụng

if($foo eq "")

hoặc là

if(length($foo) == 0)

2
2018-01-11 23:20



Đúng là Perl không có xu hướng ủng hộ "một cách thực sự" đối với việc 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 mạnh mẽ được ưu tiên. Ngoài ra, như một trong những chính quy của Perl thích nói nhiều, ngay cả khi có nhiều cách để làm mọi thứ, một số cách để làm mọi thứ thực sự, thực sự tồi tệ (ngu ngốc, không được khuyên bảo, khó duy trì, v.v.) - Telemachus
Chỉ vì có nhiều cách để làm điều đó không có nghĩa là mọi cách đều bình đẳng. Kiểm tra chuỗi rỗng bằng cách sử dụng if ($foo == ""), ví dụ, là dứt khoát sai trừ khi bạn thực sự muốn thử nghiệm xem liệu $foo, được đánh giá trong ngữ cảnh số, có giá trị bằng 0 (trong trường hợp này nó sẽ vẫnđược viết tốt hơn là if ($foo == 0), như thể hiện rõ ràng hơn ý định của bạn). - Dave Sherohman


Để kiểm tra chuỗi rỗng, bạn cũng có thể thực hiện một số thao tác như sau

if (!defined $val || $val eq '')
{
    # empty
}

0
2017-11-06 04:19