2010-01-11 33 views
72

Tôi vừa mới được sử dụng mã này để kiểm tra xem một chuỗi rỗng:Cách thích hợp để kiểm tra xem một chuỗi có rỗng trong Perl không?

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

Và cũng tương tự với các nhà điều hành không bằng ...

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

Điều này dường như làm việc (I suy nghĩ), nhưng tôi không chắc đó 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ó.

Trả lời

106

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

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

Các ==!= nhà 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.

+0

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

2

Khái niệm về 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.

Anyways đó là những nhà khai thác số, bạn nên sử dụng

if($foo eq "") 

hoặc

if(length($foo) == 0) 
+3

Đú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, là 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ệ (ngu ngốc, không được khuyên bảo, khó bảo trì) , vv) – 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. 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 kiểm tra xem liệu '$ foo', được đánh giá trong ngữ cảnh số, có giá trị bằng 0 hay không (trong trường hợp 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). –

9

Bạn có thể muốn sử dụng "eq" thay vì "==". Nếu bạn lo lắng về việc 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 

} 
+1

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

9

Như đã đề cập bởi nhiều người, eq là các nhà điều hành ngay tại đây.

Nếu bạn use warnings; trong tập lệ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 khuyên bạn nên sử dụng use strict;.

+0

+1 Tuyệt vời, vâng tôi thường sử dụng 'sử dụng nghiêm ngặt' 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 đó. –

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

  2. Nếu bạn đang ở trong tình huống mà bạn chưa bảo vệ trước undef, thì toàn bộ nội dung "không trống" sẽ không cảnh báo là if (defined $str and length $str).

+3

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. –

+3

Đượ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

0

Để kiểm tra một chuỗi rỗng bạn cũng có thể làm điều gì đó như sau

if (!defined $val || $val eq '') 
{ 
    # empty 
} 
Các vấn đề liên quan