Perl 在通过split有条件地插入散列时,是否可以避免字符串复制?

Perl 在通过split有条件地插入散列时,是否可以避免字符串复制?,perl,performance,Perl,Performance,我正在从%uniq\u c构建%grouped,其中%grouped包含通过拆分%uniq\u c的键(如果%uniq\u c的值足够高)生成的键/值对。这相当有效,但我想做得更好 %uniq_c = ( 'foo:baz' => 3, 'foo:quux' => 12, 'bar:corge' => 15, 'bar:fred' => 8, ); foreach my $gv (keys %uniq_c) { i

我正在从
%uniq\u c
构建
%grouped
,其中
%grouped
包含通过拆分
%uniq\u c
的键(如果
%uniq\u 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(%grouped)生成以下内容:

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

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;
        }
}

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;
        }
}

是什么让你相信有字符串复制发生?是什么让你相信有字符串复制发生?“字符串缓冲区被盗”:就是说l值是通过拆分直接写入的,从而避免复制出临时变量?不是,这意味着赋值将指针移动到字符串缓冲区,而不是复制字符串缓冲区本身。因此,它适用于返回temp的每个子函数和函数,而不仅仅是
split
“字符串缓冲区被盗”:这是否意味着l值通过split直接写入,从而避免复制出临时变量?不,这意味着赋值将指针移动到字符串缓冲区,而不是复制字符串缓冲区本身。因此,它适用于返回temp的每个子函数和函数,而不仅仅是
split