[英]Some string values ("0", "", and " ") are defined, but (==undef)
在我的 perl 腳本中,我使用了if ($a == undef)
條件,我認為它與if (not defined $a)
,其中$a
是從 csv 文件中讀取的字符串。 但是,我注意到定義了幾個字符串值( "", " ", "0", "-0", "+0", "@", "a"
以及許多其他空格和特殊字符)但也undef
. 如果undef
僅用於數值,則應傳遞"0"
、 "+0"
和"-0"
。 誰能解釋一下? 我現在明白我不應該使用if ($a == undef)
來替換if (not defined $a)
。
我的測試代碼是:
@a_array = ("-1", "-0", "0", "+0", "1", "", " ", "@", "a", "\$", "-");
undef $a;
test_a();
foreach $a (@a_array) {
$len_a = length($a);
test_a();
}
sub test_a {
if (defined $a) { print "a = $a is defined; "} else {print "a = $a not defined; "};
if ($a == undef) { print "a = $a (== undef); "} else {print "a = $a (!= undef); "};
if (length($a) > 0){ print "length of a is $len_a > 0 \n"} else {print "length of a is $len_a !> 0 \n"};
}
Perl 有兩個相等運算符: ==
和eq
。 ==
測試每個值的數字形式是否在數字上相等。 eq
測試每個值的字符串形式是否按字典序相等。 undef
不是字符串或數字,如果用作字符串則等效於空字符串,如果用作數字則等效於 0(空字符串也是如此,以及任何不以某些內容開頭的字符串)看起來像一個數字)。 發生這種情況時,您通常會收到警告。
要測試undef
,不應該涉及等價測試:使用定義的函數。 只有定義了才能有有意義的字符串或數值,才能進行后續的測試。
該長度函數返回undef
時通過undef
,所以如果你想知道一個標量既定義,而不是長度為0,你只需要一個布爾檢查: if (length $x)
0 和undef
都是錯誤的結果。 請注意,在 Perl 5.12 之前,這會導致警告,因為length undef
試圖將undef
用作字符串,就像eq
一樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.