Perl中的基本循环差异(++ / +1)

时间:2015-08-20 14:05:02

标签: perl

最近我试图用Perl做一个简单的循环,我发现了一个我不明白的行为。

这里的行为:

.filter("`count` >= 2")

此代码的输出将为:

my $a = {index => 0};
for (0 .. 10) {
    $a->{index} = ($a->{index}++) % 2;
    warn $a->{index};
}

但是,如果我做了同样的"代码将$ a-> {index} ++替换为$ a-> {index} +1,循环将会很好,例如

0,0,0,..,0

输出将是:

my $a = {index => 0};
for (0 .. 10) {
    $a->{index} = ($a->{index}+1) % 2;
    warn $a->{index};
}

在这种情况下,有人可以解释一下++ / +1之间的区别吗?我发现这真的很丑陋",因为如果我不将结果分配给案例中的任何变量" ++"代码将按预期工作,除非我把总和放在()。

此代码将正确执行循环:

1,0,1,0,1,0,1,0...

在总和中使用(),代码将输出:my $a = {index => 0}; for (0 .. 10) { warn $a->{index}++ % 2; }

1,2,3,4,5,6,7,8,9

1 个答案:

答案 0 :(得分:10)

$a->{index}+1会返回$a->{index}+1
$a->{index}++在更改之前返回$a->{index}
++$a->{index}会返回$a->{index}+1,但在该表达式中使用它是没有意义的,因为它会不必要地更改$a->{index}

  

$a->{index} = ($a->{index}+1) % 2;

  1. $a->{index}最初是0
  2. $a->{index}+1返回1
  3. 然后您将1 % 2 1分配给$a->{index}
  4.   

    $a->{index} = $a->{index}++ % 2;

    1. $a->{index}最初是0
    2. $a->{index}++$a->{index}设置为1并返回0(旧值)。
    3. 然后您将0 % 2 0分配给$a->{index}
    4. 选项:

      $a->{index} = ( $a->{index} + 1 ) % 2;
      if ($a->{index}) {
         ...
      }
      

      $a->{index} = $a->{index} ? 0 : 1;
      if ($a->{index}) {
         ...
      }
      

      $a->{index} = !$a->{index};
      if ($a->{index}) {
         ...
      }
      

      if (++$a->{index} % 2) {
         ...
      }
      

      if ($a->{index}++ % 2) {
         ...
      }
      

      请注意,最后两个选项在$a->{index}而不是01中的值不断增加。

      请注意,最后两个选项的不同之处在于第一遍的条件是真还是假。