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 に答える