【问题标题】:Creating a hash of arrays for DNA sequences, Perl为 DNA 序列创建数组哈希,Perl
【发布时间】:2019-03-24 02:34:58
【问题描述】:

我有一个名为 %id2seq 的散列,其中包含由键 $id 引用的 DNA 序列字符串。我希望能够通过使用字符串中的位置作为参考来操纵 DNA 序列。例如,如果我的 DNA 序列是ACGTG,我的$id 就是Sequence 1,我的$id2seq{'Sequence 1'} 就是ACGTG,我的“理论”$id2seq{'Sequence 1'}[3] 就是G。 我正在尝试创建一个数组哈希来执行此操作,但我得到了一个奇怪的输出(见下面的输出)。我很确定这只是我的格式任何输入都是有帮助的,我提前感谢。

这是输入文件的sn-p:

>Sequence 1
TCAGAACCAGTTATAAATTTATCATTTCCTTCTCCACTCCT
>Sequence 2
CCCACGCAGCCGCCCTCCTCCCCGGTCACTGACTGGTCCTG
>Sequence 3
TCGACCCTCTGGAACCTATCAGGGACCACAGTCAGCCAGGCAAG

这是我目前尝试的一个sn-p。 (我有一个哈希表可以访问一个带有注释掉 DNA 序列的文件):

use strict;
use warnings;

print "Please enter the filename of the fasta sequence data: ";
my $filename1 = <STDIN>;

#Remove newline from file
chomp $filename1;

#Open the file and store each dna seq in hash
my %id2seq = ();
my $id = '';
open (FILE, '<', $filename1) or die "Cannot open $filename1.",$!;
my $dna;
while (<FILE>)
{
    if($_ =~ /^>(.+)/)
    {
        $id = $1;
    }
    else
    {
        ## $id2seq{$id} = $_; used to create hash table
        @seqs = split '', $_;
        $id2seq{$id} = [ @seqs ];
    }
}
close FILE;
foreach $id (keys %id2seq)
{
    print "$id2seq{$id}[@seqs]\n\n";
}

输出

Use of unitialized value in concatenation (.) or string at line 37.


T

G

A

T

T

【问题讨论】:

    标签: arrays perl hash dna-sequence


    【解决方案1】:

    @seqs 包含最后一个序列中的字符。 $id2seq{$id}[@seqs] 实际上意味着 $id2seq{$id}[N] 其中N 是最后一个序列的长度。因此,您只打印每个序列中的一个字符,如果该序列比最后一个短,则会收到警告。

    如果您print 仅用于调试,则更容易:

    use Data::Dumper;
    print Dumper(\%id2seq);
    

    否则,您必须在嵌套循环中自己迭代 $id2seq{$id}

    【讨论】:

      【解决方案2】:

      此行不正确:

      print "$id2seq{$id}[@seqs]\n\n";
      

      $id2seq{$id} 是一个数组引用,所以正确的打印方式是

      print "@{ $id2seq{$id} }\n\n";
      

      一个完整的例子是:

      #!/usr/bin/perl
      use warnings;
      use strict;
      
      my $current_id;
      my %id2seq;
      while (<DATA>) {
          chomp;
          if (/^>(.+)/) {
              $current_id = $1;
          } else {
              $id2seq{$current_id} = [ split(//) ];
          }
      }
      
      print "@{ $_ }\n" foreach (values %id2seq);
      
      exit 0;
      
      __DATA__
      >Sequence 1
      TCAGAACCAGTTATAAATTTATCATTTCCTTCTCCACTCCT
      >Sequence 2
      CCCACGCAGCCGCCCTCCTCCCCGGTCACTGACTGGTCCTG
      >Sequence 3
      TCGACCCTCTGGAACCTATCAGGGACCACAGTCAGCCAGGCAAG
      

      试运行:

      $ perl dummy.pl
      T C G A C C C T C T G G A A C C T A T C A G G G A C C A C A G T C A G C C A G G C A A G
      C C C A C G C A G C C G C C C T C C T C C C C G G T C A C T G A C T G G T C C T G
      T C A G A A C C A G T T A T A A A T T T A T C A T T T C C T T C T C C A C T C C T
      

      【讨论】:

        【解决方案3】:

        你需要打印

        $id2seq{$id}[3]\n\n";
        

        获取第四个值。此外,您从未如此严格地定义 @seqs 与 'my' 并且警告正在抱怨,因此“在第 37 行使用连接 (.) 或字符串中的未初始化值。”。删除警告/严格或定义@seqs

        【讨论】:

        • 我同意达达。
        猜你喜欢
        • 2011-05-08
        • 2011-04-20
        • 2013-12-20
        • 2018-08-26
        • 1970-01-01
        • 2019-08-18
        • 1970-01-01
        • 2012-07-28
        • 1970-01-01
        相关资源
        最近更新 更多