簡體   English   中英

定義了一些字符串值(“0”、“”和“”),但是 (==undef)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM