簡體   English   中英

為什么調用此函數會改變我的數組?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM