是否可以在不同的哈希键下访问相同的值?我如何告诉 Perl 不要复制“非常长的文本”?
$hash->{'key'} = 'very long text';
$hash->{'alias'} = $hash->{'key'};
是否可以在不同的哈希键下访问相同的值?我如何告诉 Perl 不要复制“非常长的文本”?
$hash->{'key'} = 'very long text';
$hash->{'alias'} = $hash->{'key'};
简单的方法是使用对公共变量的引用。
my $hash;
my $val = 'very long text';
$hash->{key} = \$val;
$hash->{alias} = $hash->{key};
say ${ $hash->{key} }; # very long text
say ${ $hash->{alias} }; # very long text
${ $hash->{key} } = 'some other very long text';
say ${ $hash->{key} }; # some other very long text
say ${ $hash->{alias} }; # some other very long text
say $hash->{key} == $hash->{alias} ? 1 : 0; # 1
复杂的方法是使用Data::Alias。
use Data::Alias qw( alias );
my $hash;
$hash->{key} = 'very long text';
alias $hash->{alias} = $hash->{key};
say $hash->{key}; # very long text
say $hash->{alias}; # very long text
$hash->{key} = 'some other very long text';
say $hash->{key}; # some other very long text
say $hash->{alias}; # some other very long text
say \$hash->{key} == \$hash->{alias} ? 1 : 0; # 1
Tie::AliasHash会起作用,但我不建议走这条路。你想做什么,你觉得你需要别名哈希键?可能有更好的路线可以走。
使用数组引用而不是标量。
use Data::Dumper ;
my $Var = [10];
my %Hash = ('k' => $Var, 'a' => $Var);
print Dumper \%Hash;
$Hash{'a'}[0] = 'test' ;
print Dumper \%Hash;
不可以。以下解决方法是可能的:
除非我们谈论的是兆字节而不是兆字节的数据,或者除非我们这样做几千次,否则仅仅复制数据不会有太大的伤害。
my %hash = (key => 'very long text');
my $reference = \($hash{key});
print "The very long text is ", $$reference, "\n";
或者
$hash{alias} = \($hash{key});
print "The very long text is ", $$hash{alias}, "\n";
缺点:你必须使用不同的语法。
my $key = "key";
my $alias = $key;
my %hash = ($key => 'very long text');
print "The very long text is ", $hash{$alias}, "\n";
缺点:额外的变量。
您可以使用参考:
$hash->{'key'} = 'very long text';
$hash->{'alias'} = \$hash->{'key'};
print ${$hash->{alias}}, "\n" if ref $hash->{alias};