Perl。在 foreach 循环中添加异常

问题描述 投票:1回答:2

我是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],则不会被执行。如果文件是下面的任何一个,它就应该被正常执行。您认为可以实现吗?

先谢谢你了

loops perl foreach line-breaks
2个回答
1
投票

是的,只要在第一个文件上加一个检查。 只要为第一个文件添加一个检查。 改成:

print ("\n");

改为:

print ("\n") if $_ ne $S1A_SING_Files[0];

1
投票

如果数组包含唯一的字符串,你可以使用下面的方法。

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?

   ...
}

-1
投票

你的代码可以写成以下形式

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.