我想让我的脚本尽可能高效和快速地运行。以下是我创建 HoA 的方式。
use strict; use warnings; open(my $fh, '<', 'file.txt') or die $!;
my %HoA;
while (<$fh>){
$_=~ s/\r//;
chomp;
my @cols = split(/\t/, $_);
my $key = shift @cols;
push( @{$HoA{$key}, @cols );
}
说它给出了以下数据结构
%HoA = (
'C1' => ['1', '3', '3', '3'],
'C2' => ['3','2'],
'C3' => ['1','3','3','4','5','5'],
'C4' => ['3','3','4'],
'C5' => ['1'],
);
现在假设对于 HoA 中的每个键,我想将它的值(数组)和整个 HoA 传递到一个名为compute
.
这是我目前的做法。
foreach my $key ( keys %HoA ) {
compute($HoA{$key}, \%HoA); # on the first iteration, this actually passes an aref to [1,3,3,3]
}
显然 $HoA{$key} 已经是该特定 $key 的每个值的数组引用。
如果是这种情况,执行以下操作在效率方面是否有任何优势
push( @{$HoA{$key}, \@cols );
它产生以下数据结构
%HoA = (
'C1' => [ ['1', '3'], ['3', '3'] ],
'C2' => [ ['3','2'] ],
'C3' => [ ['1','3'], ['3','4'], ['5','5'] ],
'C4' => [ ['3','3','4'] ],
'C5' => [ ['1'] ],
);
这会让我的脚本运行得更快吗?如果是这样,在这种情况下,我如何将每个键的值(array_ref)传递给子例程?一旦它在子例程中,我如何访问数组中的各个元素而不取消引用子例程中的整个 array_ref?另外,对于 $hash_ref,我如何访问每个 array_ref?
这是我目前拥有的方式
sub compute{
# takes one param: an arrayref
my ($array_ref, $hash_ref) = @_;
for my $p ( @{ $array_ref) ) {
# do stuff
}
for my $x ( values %{ %hash_ref)) {
# do stuff
}
}