我是Stack Overflow的新手,我想就我的Perl代码中的一个小问题请教一下。简而言之,我写了一个小程序,它从一个预定义的数组中打开文本文件,然后搜索其中的某些字符串,最后打印出包含该字符串的行。
my @S1A_SING_Files = (
'S1A-001_SING_annotated.txt',
'S1A-002_SING_annotated.txt',
'S1A-003_SING_annotated.txt',
'S1A-004_SING_annotated.txt',
'S1A-005_SING_annotated.txt'
);
foreach (@S1A_SING_Files) {
print ("\n");
print ("Search results for $_:\n\n");
open (F, $_) or die("Can't open file!\n");
while ($line = <F>) {
if ($line =~ /\$(voc)?[R|L]D|\$Rep|\/\//) {
print ($line);
}
}
}
close (F);
我想知道是否有可能在 foreach 循环中创建一个异常,从而使含有
print ("\n");
如果文件是 $S1A_SING_Files[0],则不会被执行。如果文件是下面的任何一个,它就应该被正常执行。您认为可以实现吗?
先谢谢你了
是的,只要在第一个文件上加一个检查。 只要为第一个文件添加一个检查。 改成:
print ("\n");
改为:
print ("\n") if $_ ne $S1A_SING_Files[0];
如果数组包含唯一的字符串,你可以使用下面的方法。
print("\n") if $_ ne $S1A_SING_Files[0]; # Different stringification than 1st element?
即使数组中包含非字符串或重复的值,下面的方法也会有效(而且速度也更快)。
print("\n") if \$_ != \$S1A_SING_Files[0]; # Different scalar than 1st element?
对于神奇的数组,以上两种方法都可能失败。最可靠的解决方案是在索引上进行迭代。
for my $i (0..$#S1A_SING_Files) {
my $file = $S1A_SING_Files[$i];
print("\n") if $i; # Different index than 1st element?
...
}
你的代码可以写成以下形式
use strict;
use warnings;
my @S1A_SING_Files = (
'S1A-001_SING_annotated.txt',
'S1A-002_SING_annotated.txt',
'S1A-003_SING_annotated.txt',
'S1A-004_SING_annotated.txt',
'S1A-005_SING_annotated.txt'
);
foreach (@S1A_SING_Files) {
print "\n" unless $_ ne $S1A_SING_Files[0];
print "Search results for $_:\n\n";
open my $fh, '<', $_ or die("Can't open file!\n");
m!\$(voc)?[R|L]D|\$Rep|//! && print while <$fh>;
close $fh;
}