下面的代码可以正常工作,但是如果我用
push @array,\%hash
代替push @array,{%hash}
就不行了。请问有谁能帮助我理解其中的区别?我相信{%hash}
指的是一个匿名哈希表。这是否意味着匿名哈希表的生命周期比对命名哈希表的引用(\%hash
)更长呢?use strict;
use warnings;
use Data::Dumper;
my @array;
my %hash;
%hash = ('a' => 1,
'b' => 2,
'c' => 3,);
push @array,{%hash};
%hash = ('e' => 1,
'f' => 2,
'd' => 3,);
push @array,{%hash};
print Dumper \@array;
输出
$VAR1 = [
{
'c' => 3,
'a' => 1,
'b' => 2
},
{
'e' => 1,
'd' => 3,
'f' => 2
}
];
更新 以下是我正在处理的实际代码。我认为在这种情况下,复制引用是唯一可能的解决方案。如果我错了,请纠正我。
use Data::Dumper;
use strict;
use warnings;
my %csv_data;
my %temp_hash;
my @cols_of_interest = qw(dev_file test_file diff_file status);
<DATA>; #Skipping the header
while (my $row = <DATA>) {
chomp $row;
my @array = split /,/,$row;
@temp_hash{@cols_of_interest} = @array[3..$#array];
push @{$csv_data{$array[0]}{$array[1] . ':' . $array[2]}},{%temp_hash};
}
print Dumper \%csv_data;
__DATA__
dom,type,id,dev_file,test_file,diff_file,status
A,alpha,1234,dev_file_1234_1.txt,test_file_1234_1.txt,diff_file_1234_1.txt,pass
A,alpha,1234,dev_file_1234_2.txt,test_file_1234_2.txt,diff_file_1234_2.txt,fail
A,alpha,1234,dev_file_1234_3.txt,test_file_1234_3.txt,diff_file_1234_3.txt,pass
B,beta,4567,dev_file_4567_1.txt,test_file_4567_1.txt,diff_file_4567_1.txt,pass
B,beta,4567,dev_file_4567_2.txt,test_file_4567_2.txt,diff_file_4567_2.txt,fail
C,gamma,3435,dev_file_3435_1.txt,test_file_3435_1.txt,diff_file_3435_1.txt,pass
D,hexa,6768,dev_file_6768_1.txt,test_file_6768_1.txt,diff_file_6768_1.txt,fail
%temp_hash
定义为词法变量,然后使用常规引用会更有意义。你正在使用短但难以阅读的语法,这让你的生活变得更加困难,但必须费尽心思才能使其正常工作。如果列从不改变,只需执行push @{$csv_data{$array[0]}}{...}, { dev_file => $array[3], test_file => $array[4] .. }
。如果缩进得当,这种方法读起来更容易理解。 - simbabque