将正则表达式搜索分配给变量:未初始化的变量错误
Assigning regex search to variable: Uninitialized variable error
我在一个目录中打开文件,每个文件中包含两行序列。顶部序列比底部序列长,但包括底部序列。一旦在顶部序列中找到底部序列,我想在每个方向上通过两个侧翼字母扩展底部序列。我正在通过进行正则表达式匹配来尝试这个,但是我得到了 $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 的正则表达式赋值以获得足够的输出?谢谢。
这一行是错误的:
my ($newsequence) = $header =~ /(([CN]{2})($sequence)([CN]{2}))/;
my
关键字在 while
循环中创建一个新变量 $newsequence
,而不是在主脚本中分配变量。所以当你尝试在循环完成后写 $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";
}
}
}
如果你的条件准确(每个文件只包含 2 行,并且序列总是在 header 中找到),那么你可以使你的代码简单很多,包括正则表达式:
for my $file (@array) {
open (my $fh, $file) or die $!;
chomp ((my $header, my $sequence) = <$fh>);
$header =~ /(..)$sequence(..)/;
print OUT "$header\n$sequence";
}
我在一个目录中打开文件,每个文件中包含两行序列。顶部序列比底部序列长,但包括底部序列。一旦在顶部序列中找到底部序列,我想在每个方向上通过两个侧翼字母扩展底部序列。我正在通过进行正则表达式匹配来尝试这个,但是我得到了 $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 的正则表达式赋值以获得足够的输出?谢谢。
这一行是错误的:
my ($newsequence) = $header =~ /(([CN]{2})($sequence)([CN]{2}))/;
my
关键字在 while
循环中创建一个新变量 $newsequence
,而不是在主脚本中分配变量。所以当你尝试在循环完成后写 $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";
}
}
}
如果你的条件准确(每个文件只包含 2 行,并且序列总是在 header 中找到),那么你可以使你的代码简单很多,包括正则表达式:
for my $file (@array) {
open (my $fh, $file) or die $!;
chomp ((my $header, my $sequence) = <$fh>);
$header =~ /(..)$sequence(..)/;
print OUT "$header\n$sequence";
}