[英]Why does calling this function change my array?
每當我讀取文件時,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>)
指定給$_
。 這就是魔術的糟糕組合,可以這么說。
一般來說,除了單行之外,依靠$_
任何事情都是一個壞主意。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.