2

から構築%groupedしています%uniq_c。ここ%groupedには、分割によって生成されたキーと値のペアが含まれています%uniq_cのキー IF%uniq_cの値は十分に高いです。それはかなり効率的ですが、私はもっとうまくやりたいです。

%uniq_c = (
    'foo:baz'   => 3,
    'foo:quux'  => 12,
    'bar:corge' => 15,
    'bar:fred'  => 8,
);

foreach my $gv (keys %uniq_c) {
        if( $uniq_c{$gv} >= 10 ) {
                my ($g, $v) = split /:/, $gv, 2;
                push( @{$grouped{$g}}, $v );
        }
}

ループの反復ごとに 3 つの文字列のコピーが発生していると思います。$g の場合は 1、$v の場合は 2。$v のコピーの 1 つを削除する方法はありますか、それとも $v と $g のコピー (おそらく何らかの文字列スライス) を削除する方法はありますか?

参考までに、Data::Dump::dump(%grouped) は以下を生成します。

(
  "bar", ["corge"],
  "foo", ["quux"],
)
4

1 に答える 1

4

によって返される値のコピーsplitは非常に効率的です。文字列バッファはコピーではなくスチールされます。しかし、 を押すと別のコピーが行われます$v。これら 3 つのコピーはすべて、エイリアシングによって回避できます。

use Data::Alias qw( alias );

foreach my $gv (keys %uniq_c) {
        if( $uniq_c{$gv} >= 10 ) {
                alias my ($g, $v) = split /:/, $gv, 2;
                alias push @{$grouped{$g}}, $v;
        }
}
于 2012-06-13T19:32:28.190 に答える