2013-12-18 5 views
0

Точка общего сценария заключается в следующем:Использование итерационных переменных с регулярным выражением

шаг 1) открыть один файл столбца и считывать первую запись.

этап 2) откройте второй файл, содержащий много строк и столбцов, зачитайте КАЖДУЮ строку по одному и найдите что-нибудь в этой строке, которое соответствует первой записи из первого файла.

step3), если совпадение найдено, то «делать что-то конструктивное», а если нет, то перейти к первому файлу и взять вторую запись и повторите шаг 2 и шаг 3, и так далее ...

здесь сценарий:

#!/usr/bin/perl 
use strict; #use warnings; 

unless(@ARGV) { 
    print "\usage: $0 filename\n\n"; # $0 name of the program being executed 
    exit; 
} 

my $list = $ARGV[0]; 
chomp($list); 
unless (open(LIST, "<$list")) { 
print "\n I can't open your list of genes!!! \n"; 
exit; 
} 

my(@list) = (<LIST>); 
close LIST; 


open (CHR1, "<acembly_chr_sorted_by_exon_count.txt") or die; 

my(@spreadsheet) = (<CHR1>); 
close CHR1; 


for (my $i = 0; $i < scalar @list; $i++) { 

    print "$i in list is $list[$i]\n"; 

    for (my $j = 1; $j < scalar @spreadsheet; $j++) { 

     #print "$spreadsheet[$j]\n"; 
     if ($spreadsheet[$j]) { 
      print "will $list[$i] match with $spreadsheet[$j]?\n"; 
      } 
     else { print "no match\n" };  

    } #for 
} #for 

Я планирую использовать регулярное выражение в строке if ($spreadsheet[$j]) {, но у меня возникают проблемы на этом этапе, как сейчас. При первом введении линия print "will $list[$i] match with $spreadsheet[$j]?\n"; печатает $list[$i] OK, но не печатает $spreadsheet[$j]. Эта строка будет печатать обе переменные правильно на второй и последующих итерациях. Я не понимаю, почему?

+0

Имеет ли это какое-либо отношение к начальному индексу 'my $ j = 1;'? – summea

+0

нет, я пробовал, что это ни на что не влияет. должен был упомянуть об этом. – ES55

+0

Сколько человек входит в первый файл? Может ли несколько записей первого файла совпадать с одной строкой во втором файле? Вы относитесь к каждому матчу одинаково или по-другому, в зависимости от того, что соответствовало? – Kenosis

ответ

1

На первый взгляд ничего не выглядит явно неправильно. Как упоминалось в комментариях, $j = 1 выглядит сомнительным, но, возможно, вы пропустили первый ряд специально.

Подробнее о начальной точке отправления perlish. Если это не сработает, у вас что-то происходит с вашими входными файлами.

Обратите внимание на расширенное удаление пробелов в конце. Иногда, если вы открываете файл WINDOWS на компьютере UNIX и используете chomp, вы можете вставить в свой текст \r, что приводит к возникновению странных событий с печатным выходом.

#!/usr/bin/perl 
use strict; #use warnings; 

unless(@ARGV) { 
    print "\usage: $0 filename\n\n"; # $0 name of the program being executed 
    exit; 
} 

my $list = shift; 
unless (open(LIST, "<$list")) { 
    print "\n I can't open your list of genes!!! \n"; 
    exit; 
} 

open(CHR1, "<acembly_chr_sorted_by_exon_count.txt") or die; 
my @spreadsheet = map { s/\s+$//; $_ } <CHR1>; 
close CHR1; 

# s/\s+$//; is like chomp but trims all trailing whitespace even 
# WINDOWS files opened on a UNIX system. 

for my $item (<LIST>) { 
    $item =~ s/\s+$//; # trim all trailing whitespace 
    print "==> processing '$item'\n"; 
    for my $row (@spreadsheet) { 
     if ($row =~ /\Q$item\E/) { # see perlre for \Q \E 
      print "match '$row'\n"; 
     } 
     else { 
      print "no match '$row'\n"; 
     }  
    } 
} 

close LIST; 
+0

Спасибо. Я думаю, что ты прав насчет странных белых пространств. Я пробую вашу версию, которая выглядит очень Perl-y. Мне сказали, что мой Perl слишком похож на C, но я прогрессирую. В любом случае, каково значение «my $ list = shift»? – ES55

+0

О, я вижу. Здесь 'shift' вытаскивает элемент, хранящийся в @ARGV. Верный? – ES55

+0

@ ES55 Да, точно. – codnodder

Смежные вопросы