gpt4 book ai didi

perl - 为什么调用这个函数会改变我的数组?

转载 作者:行者123 更新时间:2023-12-04 22:26:32 25 4
gpt4 key购买 nike

每当我读取文件时,Perl 似乎都在杀死我的数组:

my @files = ("foo", "bar", "baz");
print "Files: " . join(" ", @files) . "\n";

foreach(@files) {
print "The file is $_\n";
func();
}

sub func {
open(READ, "< test.txt");
while(<READ>) {
}
close READ;
}

print "Files: " . join(" ", @files) . "\n";

产生:
Files: foo bar baz
The file is foo
The file is bar
The file is baz
Files:

但是当我注释掉 func() 时,它​​给出了我所期望的:
Files: foo bar baz
The file is foo
The file is bar
The file is baz
Files: foo bar baz

任何想法为什么会发生这种情况?

最佳答案

您必须更改 foo 以本地化 $_ ,或者不在循环中使用 $_ 。最好的方法是同时进行:

foreach my $filename (@files) {
print "The file is $filename\n";
func();
}

sub func {
local $_;
open my $read, '<', 'test.txt' or die "Couldn't open test.txt: $!";
while(<$read>) {
}
close $read or die "Couldn't close file: $!";
}

foreach 循环将 $_ 别名为文件的当前名称,而 while(<READ>) 分配给 $_ 。可以这么说,这是一个糟糕的魔法组合。

一般来说,除了单行代码之外,过多地依赖 $_ 是一个坏主意。

关于perl - 为什么调用这个函数会改变我的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/336124/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com