Как вернуть только строки, которые не соответствуют ни одному из значений массива? - PullRequest
1 голос
/ 06 марта 2011

Я пытаюсь сравнить каждую строку в CSV-файле с каждым элементом (строками), который я сохранил в массиве, используя Perl. Я хочу вернуть / напечатать в файл строку из файла CSV, только если она не соответствует ни одной из строк в массиве. Я пробовал многочисленные циклы, чтобы достичь этого, но не только не нашел решения, но ни одна из моих попыток не дает мне подсказки относительно того, где я иду не так. Ниже приведены несколько примеров циклов, которые я пробовал:

while (<CSVFILE>) {
   foreach $i (@lines) {
        print OUTPUTFILE $_ if $_ !~ m/$i/;
     }; #foreach
}; #while

И

foreach $i (@lines) {
open (CSVFILE , "< $csv") or die "Can't open $csv for read: $!";
  while (<CSVFILE>) {
    if ($_ !~ m/$i/) {
      print OUTPUTFILE $_;
    }; #if
  }; #while
close (CSVFILE) or die "Cannot close $csv: $!";
}; #foreach

Вот пример файла CSV, который я пытаюсь:

1,c.03_05delAAG,null,71...
2,c.12T>G,null,24T->G,5...
3,c.87C>T,null,96C->T,82....

И элементы массива (с escape-символами регулярного выражения):

c\.12T\>G
c\.97A\>C

Предполагая только вышеприведенное в качестве входных данных, я надеюсь вернуться:

1,c.03_05delAAG,null,71...
3,c.87C>T,null,16C->T....

, поскольку они не содержат элементов массива. Это ситуация, когда в игру вступают хэши? У меня пока нет большой информации о них, кроме стандартного определения "словарь". Если бы кто-нибудь мог помочь мне разобраться с этой проблемой, это было бы очень признательно. В этот момент я мог бы просто сделать это вручную, поскольку не так много , и мне это нужно как можно скорее, но, поскольку я не смог найти никаких ответов в поиске где-либо еще, я решил, что Стоит спросить.

1 Ответ

2 голосов
/ 06 марта 2011

Используйте Perl 5.10.1 или выше, чтобы вы могли применить интеллектуальное сопоставление . Кроме того, не используйте неявный $_, когда вы имеете дело с двумя циклами, это слишком запутанно и подвержено ошибкам.

Следующий код (не проверенный) может помочь:

use 5.010;
use strict;
use warnings;
use autodie;

...

my @regexes = map { qr{$_} } @lines;

open my $out, '>', $outputfile;
open my $csv, '<', $csvfile;

while (my $line = <$csv>) {
    print $out $line unless $line ~~ @regexes;
}

close $csv;
close $out;

Кстати, причина того, что ваш код не работает, в том, что он напечатает строку, если любой элементов в @lines не совпадает, и это всегда будет иметь место .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...