我有一個問題,找到某些文件並從中提取一些數據的子例程。Perl子跳過它被稱爲的foreach
這個子程序在一個foreach循環中被調用,但是無論何時調用,循環都跳到下一次迭代。所以我想知道是否有任何下一個從子程序逃到它被調用的foreach循環?
據我所知,子看起來很紮實,所以我希望如果有人能看到我失蹤的東西?
sub FindKit{
opendir(DH, "$FindBin::Bin\\data");
my @kitfiles = readdir(DH);
closedir(DH);
my $nametosearch = $_[0];
my $numr = 1;
foreach my $kitfile (@kitfiles)
{
# skip . and .. and Thumbs.db and non-K-files
if($kitfile =~ /^\.$/) {shift @kitfiles; next;}
if($kitfile =~ /^\.\.$/) {shift @kitfiles; next;}
if($kitfile =~ /Thumbs\.db/) {shift @kitfiles; next;}
if($kitfile =~ /^[^K]/) {shift @kitfiles; next;}
# $kitfile is the file used on this iteration of the loop
open (my $fhkits,"<","data\\$kitfile") or die "$!";
while (<$fhkits>) {}
if ($. <= 1) {
print " Empty File!";
next;
}
seek($fhkits,0,0);
while (my $kitrow = <$fhkits>) {
if ($. == 0 && $kitrow =~ /Maakartikel :\s*(\S+)\s+Montagekit.*?($nametosearch)\s{3,}/g) {
close $fhkits;
return $1;
}
}
$numr++;
close $fhkits;
}
return 0;
}
(1)全局子程序中的一些變量(或至少在封閉範圍內看到)?有些東西可以被設置,從而觸發調用者的代碼以跳過其循環。首先,有'$ numr'增加(或不增加),但不在任何地方使用。 (2)返回'($ 1)'是否會導致調用代碼跳過它的迭代? – zdim
我已經檢查過變量是否在其他地方使用。並且使用$ foundkit =&FindKit($ name)來調用這個子集,所以它將$ foundkit設置爲$ 1,但是這個變量在其他地方使用:不在有問題的foreach中被跳過。 – Zyzyx
這段代碼需要完整的重寫。 (1)當你移動時,你移除_the next_元素。這似乎不是意圖(嘗試:'perl -E'@ ary = 1..10; for(@ary){say; shift @ary}')(2)如果您想跳過'.'如果$ kitfile eq'。';'(與'..'相同),則執行'next(3)讀取整個文件以查看它是否爲空? (而且它實際上允許一行!)這就是['-z'](https://perldoc.perl.org/functions/-X.html)的用途(爲此您甚至不必打開文件)。 (4)而不是最後一個「while」 - 讀一行並執行你的條件,然後計數'$ numr ++,而<$fh>'(然後加1); – zdim