Loops Perl:向foreach循环添加异常

Loops Perl:向foreach循环添加异常,loops,perl,foreach,line-breaks,Loops,Perl,Foreach,Line Breaks,我不熟悉堆栈溢出,我想就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',

我不熟悉堆栈溢出,我想就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);
如果文件为$S1A\u SING\u Files[0],则不会执行。如果该文件是以下文件之一,则应正常执行。你认为这能实现吗


提前非常感谢

是的。只需为第一个文件添加一个检查。更改:

print ("\n");
致:


如果数组包含唯一字符串,则可以使用以下命令:

print("\n") if $_ ne $S1A_SING_Files[0];     # Different stringification 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;
}
使用严格;
使用警告;
我的@S1A\u SING\u文件=(
“S1A-001\u SING\u annotated.txt”,
“S1A-002\u SING\u annotated.txt”,
“S1A-003\u SING\u annotated.txt”,
“S1A-004\u SING\u annotated.txt”,
“S1A-005\u SING\u annotated.txt”
);
foreach(@S1A\u SING\u文件){
打印“\n”,除非$\ne$S1A\u SING\u文件[0];
打印“美元搜索结果:\n\n”;

打开我的$fh,'如果数组可以包含重复的值,则此操作不起作用,但是如果\$\uu!=\$S1A\u SING\u Files[0]
起作用。速度也更快:)
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;
}