簡體   English   中英

為什么`my $x = if (0) {1} else {2}` 不起作用?

[英]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 是一個語句。
  • 語句的返回值。
  • assignment =明確禁止右側的語句,因為它只接受表達式類中的內容。
  • 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.

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