为什么这个Perl函数似乎只处理它的一些参数?

Wak*_*nka 0 perl arguments argument-passing

为什么

my $i=0;
my @arr=();

sub readall {
    foreach (@_) {
        $arr[$i] = shift @_;
        $i++;
    }
}

readall(1, 2, 3, 4, 5);
print "@arr"
Run Code Online (Sandbox Code Playgroud)

my $i=0;
my @arr=();

sub readall {
    foreach (@_) {
        $arr[$i] = shift @_;
        print $arr[$i];
        $i++;
    }
}

readall(1, 2, 3, 4, 5);
Run Code Online (Sandbox Code Playgroud)

只打印三个参数readall

为什么这个函数看起来应该表现得一样,处理所有五个参数?

sub readall {
    foreach (@_) {
        print $_;
    }
}

readall(1, 2, 3, 4, 5);
Run Code Online (Sandbox Code Playgroud)

这也读取了所有五个(但确实按照不同的原则操作):

my @arr=();

sub readall {
    push(@arr, @_);
}

readall(1, 2, 3, 4, 5);
print "@arr"
Run Code Online (Sandbox Code Playgroud)

Kar*_*k T 6

在同一阵列上使用foreachshift可能会导致混淆.两个失败的都使用它,两者都不...不.

只是改变shift @_$_修复它.

发生这种情况是因为您在迭代时缩短了数组.