Perl:字符串中的字符串或字符串中的子字符串

时间:2016-08-13 18:49:48

标签: string perl dna-sequence

我正在处理文件中的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.

如何执行此搜索?

1 个答案:

答案 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

  • 二手功能say代替print

  • 在每个读取行之后添加chomp,以避免在数组中存储换行符。