使用带有regex的迭代变量

时间:2013-12-18 23:36:24

标签: regex perl loops nested-loops

整个脚本的要点是:

步骤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]确定但不打印$spreadsheet[$j]。该行将在第二次和后续迭代中正确打印两个变量。我不明白为什么?

1 个答案:

答案 0 :(得分:1)

乍一看,没有什么看起来不正确。正如评论中所提到的,$j = 1看起来有问题,但也许你是故意跳过第一行。

这是一个经过测试的更加圆满的起点。如果它不起作用,那么你的输入文件就会发生一些事情。

请注意扩展的尾部空格删除。有时,如果在UNIX计算机上打开WINDOWS文件并使用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;