Perl中的引用数组

时间:2015-11-25 19:09:23

标签: arrays perl reference

我已阅读参考文档,但我无法弄清楚如何取消引用数组中的数组引用。 不明白为什么@{$HoA{$cols[0]}}只打印数组的长度。非常感谢任何澄清。

file.txt

    aa      bb
    bb      cc

该计划:

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

# my $filename = "file.txt";
my @newarray;

my %HoA = (
        aa        => [ "GAT_1", "GAT_2", "GAT_3", "GAT_4" ],
        bb        => [ "GAT_6", "GAT_1", "GAT_5", "GAT_4", "GAT_2" ],
        cc        => [ "GAT_6", "GAT_4", "GAT_3", "GAT_1", "GAT_2" ],
      );

open (FILE, '<' ,"$filename") or print "$filename does not exist\n";


while (<FILE>) {
    my @cols = split;
    $cols[0] = $HoA{ $cols[0] };
    #$cols[0] = @{$HoA{ $cols[0]} };
    $cols[1] = $HoA{ $cols[1] };
    #$cols[1] = @{$HoA{ $cols[1] }};
    push ( @newarray, join( " ", @cols ));
}

close FILE;

print Dumper(\@newarray);

这是我的预期输出:

$VAR1 = [
          [
            [
              'GAT_1',
              'GAT_2',
              'GAT_3',
              'GAT_4'
            ],
            [
              'GAT_6',
              'GAT_1',
              'GAT_5',
              'GAT_4',
              'GAT_2'
            ],
        [
              'GAT_6',
              'GAT_1',
              'GAT_5',
              'GAT_4',
              'GAT_2'   
            ],
            [
              'GAT_6',
              'GAT_4',
              'GAT_3',
              'GAT_1',
              'GAT_2'
            ],

          ]
        ];

这是我的实际输出:

$VAR1 = [
          'ARRAY(0x7f80110060e8) ARRAY(0x7f801102eb58)',
          'ARRAY(0x7f801102eb58) ARRAY(0x7f801102f308)'
        ];

1 个答案:

答案 0 :(得分:4)

最大的问题是这一行:

    push ( @newarray, join( " ", @cols ));

join本质上是一个字符串操作:@cols是一个引用数组,join然后尽职尽责地进行字符串化,以便它可以将它们与" "连接起来。

看起来你真正想要的可能就是:

    push ( @newarray, [@cols] );

其中[ ... ]表示法创建一个新的匿名数组(在本例中填充了@cols中的值)并返回对它的引用。

此外,而不是:

    $cols[0] = $HoA{ $cols[0] };

(导致@newarray%HoA最终包含对相同底层数组的引用),可能想要这样:

    $cols[0] = [ @{$HoA{ $cols[0] }} ];

(这样@newarray最终得到完全独立的数组,这些数组只是以与%HoA中的数据相同的数据开始。这取决于您是否计划在之后修改任何数组。