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

前端之家收集整理的这篇文章主要介绍了Perl中的基本循环差异(/ 1)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
最近我试图用Perl做一个简单的循环,我发现了一个我不明白的行为.

这里的行为:

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

代码输出将是:

0,..,0

但是,如果我使用$a-> {index} 1替换$a-> {index}的“相同”代码,循环将会很好,例如

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

输出将是:

1,1,0...

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

代码将正确执行循环:

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

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

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

解决方法

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

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

>假设$a-> {index}最初为0.
> $a-> {index} 1返回1.
>然后你分配1%2,即1到$a-> {index}.

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

>假设$a-> {index}最初为0.
> $a-> {index}将$a-> {index}设置为1并返回0(旧值).
>然后指定0%2,即0到$a-> {index}.

选项:

$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}中的值不断增加,而不是0或1.

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

猜你在找的Perl相关文章