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

jor*_*dor 8 perl

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

这里的行为:

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

此代码的输出将是:

0,0,0,..,0
Run Code Online (Sandbox Code Playgroud)

但是,如果我用'a - > {index} +1替换$ a - > {index} ++的"相同"代码,循环就可以了,例如

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

输出将是:

1,0,1,0,1,0,1,0...
Run Code Online (Sandbox Code Playgroud)

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

此代码将正确执行循环:

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

使用总和中的(),代码将输出: 1,2,3,4,5,6,7,8,9

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

ike*_*ami 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}.

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

  1. $a->{index}是最初的0.
  2. $a->{index}++设置$a->{index}1并返回0(旧值).
  3. 然后分配0 % 2,这是0$a->{index}.

选项:

$a->{index} = ( $a->{index} + 1 ) % 2;
if ($a->{index}) {
   ...
}
Run Code Online (Sandbox Code Playgroud)

要么

$a->{index} = $a->{index} ? 0 : 1;
if ($a->{index}) {
   ...
}
Run Code Online (Sandbox Code Playgroud)

要么

$a->{index} = !$a->{index};
if ($a->{index}) {
   ...
}
Run Code Online (Sandbox Code Playgroud)

要么

if (++$a->{index} % 2) {
   ...
}
Run Code Online (Sandbox Code Playgroud)

要么

if ($a->{index}++ % 2) {
   ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 一个好的经验法则是永远不要写`$ var = ... ++ $ var ...`或`$ var = ... $ var ++ ...`. (7认同)