在for循环范围内声明的Perl标量在迭代之间保留其值

fle*_*esk 6 perl for-loop

这是我关于SO的第一个问题,很抱歉,如果这很愚蠢,但是当我最近在生产代码中遇到它时,这真的让我很困惑.我把我的问题归结为两个代码块,我希望它能做同样的事情,即为每次迭代生成一个随机数:

for my $num (0 .. 5) {
    my $id = int rand 10;
    print "$id\n";    
}
Run Code Online (Sandbox Code Playgroud)

for (0 .. 5) {
    my $tmp;
    my $id = $tmp if $tmp;

    $id = int rand 10 unless $id;
    print "$id\n";
}
Run Code Online (Sandbox Code Playgroud)

第一个执行我期望它做的事情,但第二个执行任意数量的迭代相同的数字.$tmp在这种简化中总是未定义,所以它只是在那里显示行为,因为遗漏= $tmp if $tmp会产生我期望的结果.

我很欣赏为什么会发生这种情况.

Bor*_*din 11

究其原因,奇怪的现象是,你已作出声明$id,以及分配给它,对真理的条件$tmp,这使Perl的发脾气.perldoc perlsyn有这个说来

注意:my,state或我们使用语句修饰符条件或循环结构修改的行为(例如,我的$ x if ...)是未定义的.my变量的值可以是undef,任何先前分配的值,或者可能是其他任何值.不要依赖它.perl的未来版本可能会与您尝试使用的perl版本有所不同.这里是龙.

如果您更改代码如下,您可以自己演示这一点,这很好.

for (0 .. 5) {
    my $tmp;
    my $id;
    $id = $tmp if $tmp;

    $id = int rand 10 unless $id;
    print "$id\n";
}
Run Code Online (Sandbox Code Playgroud)