Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String Perl:从3个可能的值中指定一个变量_String_Perl_Dna Sequence - Fatal编程技术网

String Perl:从3个可能的值中指定一个变量

String Perl:从3个可能的值中指定一个变量,string,perl,dna-sequence,String,Perl,Dna Sequence,我有一个DNA序列。让我们称之为“ATCG”。我在两个单独的文件中有两个小的DNA序列数据库,我们称之为“db1.txt”和“db2.txt”。两个数据库的格式如下: >name of sequence EXAMPLESEQUENCEATCGATCG >name of another sequence ASECONDEXAMPLESEQUENCEATCGATCG 我想知道我的DNA序列是否包含在其中一个数据库中,如果是,是哪一个数据库。因此,我的结果有3个可能的值:我的序列既不在数

我有一个DNA序列。让我们称之为“ATCG”。我在两个单独的文件中有两个小的DNA序列数据库,我们称之为“db1.txt”和“db2.txt”。两个数据库的格式如下:

>name of sequence
EXAMPLESEQUENCEATCGATCG
>name of another sequence
ASECONDEXAMPLESEQUENCEATCGATCG
我想知道我的DNA序列是否包含在其中一个数据库中,如果是,是哪一个数据库。因此,我的结果有3个可能的值:我的序列既不在数据库中,也不在db1中,也不在db2中。这是我的密码:

use warnings;
use strict;
my $entry = 'ATCG';
my $returnval = "The sequence is from neither database";

#if in db1
    my $name1;
    my $seq1;
    open (my $database1, "<", "db1.txt") or die "Can't find db1";
    while (<$database1>){
        chomp ($name1 = <$database1>);
        chomp ($seq1 = <$database1>);
        if (
            index($seq1, $entry) != -1
            || index($entry, $seq1) != -1
        ) {
            $returnval = "The sequence is from db1: ". $name1;
            last;
        }
    }

#If in db2:
    my $name2;
    my $seq2;
    open (my $database2, "<", "db2.txt") or die "Can't find db2";
    while (<$database2>){
        chomp ($name2 = <$database2>);
        chomp ($seq2 = <$database2>);
        if(
            index($seq2, $entry) != -1
            || index($entry, $seq2) != -1
        ) {
            $returnval = "The sequence is from db2: ". $name2;
            last;
        }

    }
    print $returnval . "\n";
使用警告;
严格使用;
my$条目='ATCG';
my$returnval=“序列不来自任何一个数据库”;
#如果在db1中
我的$name1;
我的$seq1;

打开(my$database1,"主要问题在于while循环的条件,它在每次迭代中读取并丢弃一行,并防止
$name
$seq
变量每次都包含名称和序列。删除该条件并在循环中检查文件结尾应该可以解决问题。还可以循环ov对两个数据库执行er操作,并对这两个数据库应用相同的逻辑,因此您只需要一个循环来检查每个文件的内容

use warnings;
use strict;
my $entry = 'ATCG';
my $returnval = "The sequence is from neither database";
my @files = qw(db2 db1);

FILE:
for my $file (@files) {
    open my $fh, '<', "$file.txt" or die "Error opening $file: $!";
    while (1) {
        my $name = <$fh>;
        my $seq  = <$fh>;
        if (not defined $seq) {
            warn "Odd number of lines in $file" if defined $name;
            last; # Reached end of file
        }
        chomp($name, $seq);
        if (
            index($seq, $entry) != -1
            or index($entry, $seq) != -1
        ) {
            $returnval = "The sequence is from $file: $name";
            last FILE; # No need to search the others
        }
    }
}

print "$returnval\n";
使用警告;
严格使用;
my$条目='ATCG';
my$returnval=“序列不来自任何一个数据库”;
my@files=qw(db2db1);
文件:
对于我的$file(@files){

打开我的$fh,“我会将比较包装在一个子例程中,尤其是因为您必须多次执行相同的操作

此解决方案实现一个子例程
matches
,该子例程返回文件中匹配序列的名称,如果未找到,则返回假值

我已将记录分隔符
$/
更改为
字符,以便自动拆分序列,每个记录由名称组成,直到第一个换行符,然后是序列。
tr/\n//d
调用从序列中删除任何换行符(因此它将处理FAST格式支持的多行序列),并对每个序列进行比较

调用代码仅使用
for
循环调用每个文件名的子例程。一旦找到匹配项,循环即退出,将
$name
$file
设置为匹配的详细信息

消息是根据
$name
是否为真来生成和打印的

use strict;
use warnings 'all';
use feature 'say';

my $entry = 'ATCG';

my ($file, $name);

for $file ( qw/ db2 db1 / ) {
    last if $name = matches($entry, "$file.txt");
}

say $name ?
    "The sequence is from $file: $name" :
    "The sequence is from neither database";


sub matches {
    my ($seq, $file) = @_;

    open my $fh, '<', $file or die qq{Unable to open "$file" for input: $!};

    local $/ = '>';

    while ( <$fh> ) {
        chomp;
        my ($name, $file_seq) = split /\n/, $_, 2;
        $file_seq =~ tr/\n//d;

        return $name if index($file_seq, $seq) >= 0 or index($seq, $file_seq) >= 0;
    }

    return;
}
使用严格;
使用“全部”警告;
使用特征“说”;
my$条目='ATCG';
我的($file,$name);
对于$file(qw/db2db1/){
如果$name=matches($entry,“$file.txt”);
}
说$name?
“序列来自$file:$name”:
“序列来自两个数据库”;
子匹配{
我的($seq,$file)=@;
打开我的$fh,';
而(){
咀嚼;
我的($name,$file_seq)=拆分/\n/,$,2;
$file_seq=~tr/\n//d;
如果索引($file seq,$seq)>=0或索引($seq,$file seq)>=0,则返回$name;
}
返回;
}

甚至不应该编译。
$name
是未声明的。这不是实际的代码。我取出相关部分并重命名了一些变量,以便于阅读。
while(啊,那么我如何实现while(
不读一行?将
while
语句替换为
直到(eof$database1){
(显然,在第二个循环中将1改为2。)不需要
标签。这就是你要做的吗?@Borodin哦,这是一个疏忽。除非必要,我通常不会给循环加标签。