我正在%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 );
}
}
我认为每次循环迭代都会发生三个字符串副本; 1美元为$ g,2美元为$ v。有没有办法消除$ v副本中的一个,或者更好的是,$ v和$ g副本(可能是某种字符串切片)?
作为参考,Data :: Dump :: dump(%groups)产生以下内容:
(
"bar", ["corge"],
"foo", ["quux"],
)
答案 0 :(得分:4)
复制split
返回的值非常有效;字符串缓冲区被盗而不是被复制。但推送$v
时还有另一个副本。通过别名可以避免所有这三个副本。
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;
}
}