0

スクリプトをできるだけ効率的かつ高速に実行したいと考えています。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
    }
}
4

2 に答える 2