Perl: добавление исключения в цикл foreach - PullRequest
2 голосов
/ 01 мая 2020

Я новичок в 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 l oop, чтобы строка, содержащая

print ("\n");

, не выполнялась, если файл равен $ S1A_SING_Files [0]. Затем он должен нормально выполняться, если файл является одним из следующих. Как вы думаете, это может быть достигнуто?

Большое спасибо заранее!

Ответы [ 3 ]

1 голос
/ 01 мая 2020

Если массив содержит уникальные строки, вы можете использовать следующее:

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 голос
/ 01 мая 2020

Да. Просто добавьте проверку для первого файла. Изменить:

print ("\n");

на:

print ("\n") if $_ ne $S1A_SING_Files[0];
0 голосов
/ 02 мая 2020

Ваш код может быть написан в следующей форме

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