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;
}