【问题标题】:Creating an expandable hash of arrays in Perl在 Perl 中创建可扩展的数组散列
【发布时间】:2013-10-24 19:35:39
【问题描述】:

我正在解析一个文件,每奇数行给我一个“字母”(A、B、C 等),每偶数行给我一个“二进制序列”(0101、1111、0001 等)。

我想创建一个数组散列(但如果您认为另一种数据类型更合适,请告诉我)以保持所有行井井有条。

我知道数组的有可能看起来像:

%HoA = (
    A  => [ "0001", "1010" ],
    B  => [ "0011", "1111", "0111" ],
    C  => [ "0000"],
);

而且我知道如何访问这种数据类型的信息。

但是,我在创建这种数据类型时遇到了麻烦。

例如,我能够正确获取文件的“字母”($letter)和“二进制序列”($seq),使用类似:

while (<INPUT>) {
    s/[\n\r]//mg;

    if ( /^>/) {
        $letter = substr($_, 7, 1);
    }
    if ( /^[01]/) {
        $seq = $_;
    }
}

但我不确定如何:

  1. 创建数组的哈希,
  2. 首先检查该“字母”是否已作为键存在于哈希中
  3. 如果“字母”不作为密钥存在,那么如何将其创建为新密钥
  4. 在确定“字母”已经存在或创建它(如果不存在)之后,如何将“seq”作为值添加到“字母”。

如果不能在 Perl 中创建这样的数据类型,那么我将不胜感激有关转向哪种​​数据类型的任何建议!我需要将每个“字母”附加到它的所有“序列”上。

任何帮助将不胜感激!

【问题讨论】:

    标签: arrays perl hash


    【解决方案1】:

    假设您的数据是可靠的。

    #!/usr/bin/perl
    use strict;
    use warnings FATAL => qw/all/;
    use Data::Dumper;
    
    $/ = "\r\n";
    
    my %HoA;
    
    while (<DATA>)
    {
        my $letter = substr($_, 7, 1);
        chomp(my $seq = <DATA>);
    
        push @{$HoA{$letter}}, $seq;
    }
    
    print Dumper \%HoA;
    
    __DATA__
    >      A
    0001
    >      A
    1010
    >      B
    0011
    >      B
    1111
    >      B
    0111
    >      C
    0000
    

    【讨论】:

    • 非常感谢您对 Data::Dumper 的建议。感谢那。我只是好奇:第6行是什么意思:$/ = "\r\n";
    • $/ 是一个特殊变量,输入记录分隔符。它控制 Perl 在从文件句柄读取时将块分割到哪个字符串上。默认情况下它是\n,但我注意到您正在处理回车,因此将其设置为\r\n 作为您的正则表达式替换方法的替代方法。 chomp 也将指代$/
    【解决方案2】:

    要创建哈希,只需将my %HoA; 放在代码的开头即可。给定$letter$seq,您只需执行push @{$HoA{$letter}}, $seq; 就可以一次完成步骤2-4,Perl 会处理这些细节。

    【讨论】:

      【解决方案3】:

      检查perl data structures cookbook

      my %HoA;
      my $letter;
      while (<INPUT>) {
          s/[\n\r]//g;
      
          if ( /^>/) {
              $letter = substr($_, 7, 1);
          }
          if ( /^[01]/) {
              #  $seq = $_;
              push @{ $HoA{$letter} }, $_;
          }
      }
      

      【讨论】:

      • 鉴于OP的原始问题,这是最有用的答案。
      猜你喜欢
      • 1970-01-01
      • 2016-07-02
      • 1970-01-01
      • 1970-01-01
      • 2013-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多