我正在处理文件中的DNA序列,这个文件的格式是这样的,但有多个序列:
>name of sequence
EXAMPLESEQUENCEATCGATCGATCG
我需要能够判断一个变量(也是一个序列)是否与文件中的任何序列匹配,以及它匹配的序列名称(如果有的话)是什么。由于这些序列的性质,我的整个变量可以包含在文件的一行中,或者变量的一行可以是我的变量的一部分。 现在我的代码看起来像这样:
use warnings;
use strict;
my $filename = "/users/me/file/path/file.txt";
my $exampleentry = "ATCG";
my $returnval = "The sequence does not match any in the file";
open file, "<$filename" or die "Can't find file";
my @Name;
my @Sequence;
my $inx = 0;
while (<file>){
$Name[$inx] = <file>;
$Sequence[$inx] = <file>;
$indx++;
}unless(index($Sequence[$inx], $exampleentry) != -1 || index($exampleentry, $Sequence[$inx]) != -1){
$returnval = "The sequence matches: ". $Name[$inx];
}
print $returnval;
但是,即使我故意将$ entry设置为文件中的匹配项,我仍然会返回The sequence does not match any in the file
。此外,在运行代码时,我得到Use of uninitialized value in index at thiscode.pl line 14, <file> line 3002.
以及Use of uninitialized value within @Name in concatenation (.) or string at thiscode.pl line 15, <file> line 3002.
如何执行此搜索?
答案 0 :(得分:1)
我将假设此脚本的目的是确定$exampleentry
是否与文件file.txt
中的任何记录匹配。 记录在这里描述了DNA序列并且对应于文件中的三个连续行。如果变量$exampleentry
与记录的第三行匹配,则变量$exampleentry
将匹配。匹配在这里意味着
$line
是$line
或$exampleentry
是$line
的子字符串,其中file.txt
引用文件中的相应行。
首先,考虑输入文件>name of sequence
EXAMPLESEQUENCEATCGATCGATCG
:
undef
在程序中,您尝试使用三个调用readline
来读取这些两个行。因此,最后一次调用readline将返回file.txt
,因为没有更多行要读取。
因此,>name of sequence
EXAMPLESEQUENCE
ATCGATCGATCG
中的最后两行格式错误似乎是合理的,正确的格式应为:
use feature qw(say);
use strict;
use warnings;
my $filename = "file.txt";
my $exampleentry = "ATCG";
my $returnval = "The sequence does not match any in the file";
open (my $fh, '<', $filename ) or die "Can't find file: $!";
my @name;
my @sequence;
my $inx = 0;
while (<$fh>) {
chomp ($name[$inx] = <$fh>);
chomp ($sequence[$inx] = <$fh>);
if (
index($sequence[$inx], $exampleentry) != -1
|| index($exampleentry, $sequence[$inx]) != -1
) {
$returnval = "The sequence matches: ". $name[$inx];
last;
}
}
say $returnval;
如果我现在正确理解你,我希望这可以解决你的问题:
@Name
备注:强>
我更改了变量名称以跟随snake_case convention。例如,使用全部小写@name
可以更好地编写变量open()
。
我更改了not integer
调用以遵循新推荐的3参数样式,有关详细信息,请参阅Don't Open Files in the old way。
在每个读取行之后添加chomp,以避免在数组中存储换行符。