最近我试图用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;
$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}) {
...
}
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}而不是0或1.
请注意,最后两个选项的不同之处在于第一遍中条件是真还是假.