我有一个问题,找到某些文件并从中提取一些数据的子例程。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