【问题标题】:Meaning of the perl syntax construction involving a comma涉及逗号的 perl 语法结构的含义
【发布时间】:2020-01-29 20:04:39
【问题描述】:

我在一本书中遇到过一段代码,看起来像这样:

#for (some_condition) {
#do something not particularly related to the question
$var = $anotherVar+1, next if #some other condition with $var
#}

我不知道 $anotherVar+1next 之前的逗号 (",") 有什么作用。这种语法结构是如何调用的,它是否正确?

【问题讨论】:

  • 你的意思是comma operator?您可以将它用作备用语句分隔符,这似乎是这里发生的事情,但这不是最好的主意。请改用; 和新语句。

标签: perl perlsyn


【解决方案1】:

perlop 中描述了逗号运算符。您可以使用它来分隔命令,它首先评估其左操作数,然后评估第二个操作数。在这种情况下,第二个操作数是next,它改变了程序的流程。

基本上,这是一种较短的写作方式

if ($var eq "...") {
    $var = $anotherVar + 1;
    next
}

逗号可以在 C 中以类似的方式使用,您可以在 for 循环中经常找到它:

for (i = 0, j = 10; i < 10; i++, j--)

【讨论】:

  • 我更喜欢更长的版本(使用每行一个语句的块)。如果您将 2 个语句塞进“如果”,那么您很可能需要添加更多语句。较长的形式更清晰和可维护。
  • @Timur Shtatland,更糟糕的是它隐藏了流控制更改 (next)。
【解决方案2】:

在任何情况下,逗号都是an operator。在通常看到的列表上下文中,这是将值连接到列表中的一种方法。这里它在标量上下文中使用,它运行前面的表达式,后面的表达式,然后返回下面的表达式。当它不是参数分隔符时,这是它在 C 和类似语言中的工作方式的保留;见https://docs.microsoft.com/en-us/cpp/cpp/comma-operator?view=vs-2019

my @stuff = ('a', 'b'); # comma in list context, forms a list and assigns it
my $stuff = ('a', 'b'); # comma in scalar context, assigns "b"
my $stuff = 'a', 'b'; # assignment has higher precedence
                      # assignment done first then comma operator evaluated in greater context

【讨论】:

    【解决方案3】:

    考虑以下代码:

    $x=1;
    $y=1;
    
    $x++ , $y++ if 0; # note the comma! both x and y are one statement
    print "With comma: $x $y\n";
    
    $x=1;
    $y=1;
    
    $x++ ; $y++ if 0; # note the semicolon! so two separate statements
    
    print "With semicolon: $x $y\n";
    

    输出如下:

    With comma: 1 1
    With semicolon: 2 1
    

    逗号类似于分号,只是命令的两边都被视为一条语句。这意味着在只需要一个语句的情况下,逗号的两边都会被计算。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-28
      • 1970-01-01
      相关资源
      最近更新 更多