Perl:向 foreach 循环添加异常
Perl: Adding an exception to a foreach loop
我是 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;
}
我是 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;
}