2014-09-24 54 views
2
print !$num; 

當$ num是1時,我希望看到0.但是,沒有任何打印。爲什麼?謝謝你的評論。

以下是我嘗試過的一些測試。這與我的問題一致。

print 1;  # 1 
print 0;  # 0 
print !1; # (nothing) 
print !0; # 1 
print !1 == 0; # 1 

邁克爾

+0

'print 0 +!$ num;' – Slade 2014-09-24 19:06:05

回答

5

的「 」假布爾在Perl是特殊的值,當評價爲字符串被視爲"",但在一個數值範圍內,它被當作0

這就是爲什麼印刷否定真正價值的時候,你看到的空字符串:

$ perl -MData::Dump -e 'dd !1' 
"" 

要看到價值0,必須在數字環境中使用它。您可以通過簡單地添加0的值做到這一點:

$ perl -MData::Dump -e 'dd 0 + !1' 
0 

有關布爾更多信息,請perldata - Scalar Values

+3

Re「Perl中默認的」false「布爾值是空字符串''''」。並非如此。這是一個包含'0'和空字符串的雙重變量。 'perl -wE'say 0+!1;說0 +「」''只會警告後者的說法。 – ikegami 2014-09-24 19:11:38

+1

是的,我知道這在技術上是正確的。但是,我不確定如何以初學者的語言來構建。我會考慮並回來,或隨意給我一個手。 – Miller 2014-09-24 19:17:14

+1

我認爲最後的[答案](http://stackoverflow.com/a/1140031/176646)到了愚蠢的目標解釋得很好,雖然它有點長。特別是最後一部分:「總之,你沒有得到任何東西,你沒有得到一個空字符串,並且你沒有得到零。你得到一個變量,它既是空字符串也是0同時。「 – ThisSuitIsBlackNot 2014-09-24 19:19:53

4

按照docs

數字0,字符串 '0' 和 「」,空列表(),和民主基金 是在布爾上下文全是假的。其他所有值都是正確的。 否定了真正的價值!或者不返回一個特殊的錯誤值。 以字符串形式進行評估時,它被視爲「」,但是作爲數字,它會被視爲0。大多數返回true或false的Perl運算符都以這種方式運行 。

print正在評估!1作爲字符串,所以它被視爲""


如果您在數值上下文評估!1,它將被視爲0

$ perl -MData::Dumper -e'print Dumper !1+!1' 
$VAR1 = 0; 
0

在一般意義上,有一個品種,是true值和多種是false值。所以not true在布爾上下文中是有效的,但是當你print它是不明確的。