【问题标题】:Perl: Adding an exception to a foreach loopPerl:向 foreach 循环添加异常
【发布时间】:2020-05-01 19:26:28
【问题描述】:

我是 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


    【解决方案1】:

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

    print ("\n");
    

    到:

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

    【讨论】:

    • 如果数组可以包含重复值,这不起作用,但if \$_ != \$S1A_SING_Files[0] 可以。也更快:)
    【解决方案2】:

    如果数组包含唯一的字符串,你可以使用如下:

    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?
    
       ...
    }
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-12-22
        • 2019-05-02
        • 1970-01-01
        • 2013-10-04
        • 2021-06-07
        • 2020-04-25
        • 1970-01-01
        相关资源
        最近更新 更多