[英]Why doesn't `my $x = if (0) {1} else {2}` work?
在 perl 中, $x = if (0) {1} else {2}
不起作用。
$ perl -E'$x = if (0) {1} else {2}'
syntax error at -e line 1, near "= if"
Execution of -e aborted due to compilation errors.
這是有道理的,因為if
條件不是 Perl 中的表達式。 他們是流量控制。
但是之后
my $x = do { if (0) {1} else {2} };
行得通! 為什么do BLOCK
可以接受if
條件? 但是賦值不行嗎? 在上面看來,流量控制必須要么
do BLOCK
知道它的上下文此外,鑒於上面的簡單事實,描述具有這種行為的 if 條件的正確方法是什么? 它是一個帶有值的表達式嗎? 流控制結構是否在評估后沒有價值?
最后,必須對賦值進行哪些修改才能使其接受像do BLOCK
這樣的if
條件。
解決問題的唯一答案和評論是 Ginnz,
總體設計是 perl 具有僅在某些上下文中有意義的關鍵字,並且
if
是其中之一 - 它只能是語句的開頭或語句修飾符,並且它們都不能直接在=
之后有效。 這首先是解析器的區別。 除此之外,“if
語句返回什么”的考慮並不總是直觀的,因此雖然您可以通過將其放在 do 塊或子例程的最后一條語句中來發現這一點,但不應該鼓勵使用它作為一個值。 事實上,它通常會導致錯誤。 – Grinnz 11 小時前
當 Ginnz 說解析器的區別時,我將其解釋為意味着為了清楚起見,這並不值得追求。 =
之后有效的內容根本不是if
語句,並且沒有真正的理由,只是它是這樣的。
if
conditional 是一個語句。=
明確禁止右側的語句,因為它只接受表達式類中的內容。do BLOCK
可以將語句轉換為表達式。DO 塊內的代碼表現不同。 Perl 解釋大括號內的代碼並輸出最后一個命令的結果。
#!/usr/bin/perl
use Data::Dumper;
my $x = do { { 1==1 } };
my $y = do { { 1==0 } };
print Dumper 1==0;
print Dumper $x;
print Dumper $y;
閱讀有關 do 的更多信息: https : //perldoc.perl.org/perlfunc#do
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.