4

是否可以在不同的哈希键下访问相同的值?我如何告诉 Perl 不要复制“非常长的文本”?

$hash->{'key'} = 'very long text';
$hash->{'alias'} = $hash->{'key'};
4

5 回答 5

6

简单的方法是使用对公共变量的引用。

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
于 2012-09-20T15:30:54.170 回答
5

Tie::AliasHash会起作用,但我不建议走这条路。你想做什么,你觉得你需要别名哈希键?可能有更好的路线可以走。

于 2012-09-20T14:10:24.530 回答
2

使用数组引用而不是标量。

use Data::Dumper ;

my $Var = [10];
my %Hash = ('k' => $Var, 'a' => $Var);

print Dumper \%Hash;
$Hash{'a'}[0] = 'test' ;
print Dumper \%Hash;
于 2012-09-20T14:14:40.723 回答
1

不可以。以下解决方法是可能的:

复制就好

除非我们谈论的是兆字节而不是兆字节的数据,或者除非我们这样做几千次,否则仅仅复制数据不会有太大的伤害。

使用参考

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

缺点:额外的变量。

于 2012-09-20T14:08:01.760 回答
0

您可以使用参考:

$hash->{'key'} = 'very long text';
$hash->{'alias'} = \$hash->{'key'};
print ${$hash->{alias}}, "\n" if ref $hash->{alias};
于 2012-09-20T14:06:00.170 回答