将正则表达式搜索分配给变量:未初始化的变量错误

时间:2016-08-11 19:28:45

标签: regex perl variables fasta

我在一个目录中打开文件,每个文件中包含两行序列。顶部序列比底部长,但包括底部序列。一旦在顶部序列中找到,我想通过每个方向上的两个侧翼字母来扩展底部序列。我正在通过执行正则表达式匹配来尝试这个,但是我得到了$ newsequence变量的未初始化错误。 这是典型文件的样子:

    >CCCCNNNNNCCCC
    NNNNN 

我想以下列格式将所有序列打印到一个文件中:

    >CCCCNNNNNCCCC
    CCNNNNNCC 

到目前为止,这是我的代码:

    use strict; 
    use warnings; 

    my ($directory) = @ARGV 
    my @array = glob "$directory/*"; 
    my $header; 
    my $sequence; 
    my $newsequence; 

    open(OUT, ">", "/path/to/out.txt") or die $!; 
    foreach my $file (@array){ 
        open (my $fh, $file) or die $!; 
        while (my $line = <$fh>){ 
            chomp $line; 
            if ($line =~ /^>/) { 
                $header = $line; 
            } elsif ($line =~ /^[CN]/) { 
                $sequence = $line; 
            } 
            my ($newsequence) = $header =~ /(([CN]{2})($sequence)([CN]{2}))/; 
        } 
        print OUT $header, "\n", $newsequence, "\n"; 
    } 

如何将我的正则表达式赋值改为$ newsequence以获得足够的输出?谢谢。

2 个答案:

答案 0 :(得分:2)

这一行错了:

my ($newsequence) = $header =~ /(([CN]{2})($sequence)([CN]{2}))/; 

my关键字正在为$newsequence循环创建一个新的变量while,而不是在主脚本中分配变量。因此,当您在循环完成后尝试编写$newsequence时,该变量仍然未初始化。

print语句放在while循环中,或删除此作业中的my关键字。

此外,您应该将该赋值语句放在elseif块中。否则,您在分配之前尝试使用$sequence。所以整个事情应该是这样的:

foreach my $file (@array){ 
    open (my $fh, $file) or die $!; 
    while (my $line = <$fh>){ 
        chomp $line; 
        if ($line =~ /^>/) { 
            $header = $line; 
        } elsif ($line =~ /^[CN]/) { 
            $sequence = $line; 
            ($newsequence) = $header =~ /(([CN]{2})($sequence)([CN]{2}))/; 
            print OUT $header, "\n", $newsequence, "\n"; 
        } 
    } 

} 

答案 1 :(得分:0)

如果您的条件准确(每个文件只包含2行,并且序列总是在标题中找到),那么您可以使代码更简单,包括正则表达式:

for my $file (@array) {
  open (my $fh, $file) or die $!;
  chomp ((my $header, my $sequence) = <$fh>);
  $header =~ /(..)$sequence(..)/;
  print OUT "$header\n$1$sequence$2";
}
相关问题