我已经阅读了参考文档,但我不知道如何取消数组中的数组引用。不明白为什么@{$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)'
];
发布于 2015-11-25 12:15:01
最大的问题是这条线:
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
中相同的数据开始)。这取决于以后是否打算修改任何数组。
https://stackoverflow.com/questions/33924605
复制相似问题