У меня есть три хэша с именами %hash1, %hash2, %hash3. Мне нужно ссылаться на каждый хэш по переменной, и я не уверен, как это сделать.
#!/usr/bin/perl
# Hashes %hash1, %hash2, %hash3 are populated with data.
@hashes = qw(hash1 hash2 hash3);
foreach $hash(@hashes){
foreach $key(keys $$hash){
.. Do something with the hash key and value
}
}
Я знаю, что это довольно упрощенный, сравнительно нубский вопрос, поэтому приношу извинения за это.
Ответ 1 · рейтинг 17 · Brad Gilbert
Это должно сработать для вас.
#!/usr/bin/perl
use strict;
use warnings;
my( %hash1, %hash2, %hash3 );
# ...
# load up %hash1 %hash2 and %hash3
# ...
my @hash_refs = ( \%hash1, \%hash2, \%hash3 );
for my $hash_ref ( @hash_refs ){
for my $key ( keys %$hash_ref ){
my $value = $hash_ref->{$key};
# ...
}
}
Он использует хэш-ссылки вместо использования символических ссылок. Очень легко ошибиться в символических ссылках, и их может быть сложно отлаживать.
Вот как вы могли бы использовать символические ссылки, но я бы не советовал этого делать.
#!/usr/bin/perl
use strict;
use warnings;
# can't use 'my'
our( %hash1, %hash2, %hash3 );
# load up the hashes here
my @hash_names = qw' hash1 hash2 hash3 ';
for my $hash_name ( @hash_names ){
print STDERR "WARNING: using symbolic references\n";
# uh oh, we have to turn off the safety net
no strict 'refs';
for my $key ( keys %$hash_name ){
my $value = $hash_name->{$key};
# that was scary, better turn the safety net back on
use strict 'refs';
# ...
}
# we also have to turn on the safety net here
use strict 'refs';
# ...
}
Ответ 2 · рейтинг 1 · Logan
Чтобы сослаться на хэш по ссылке, вы можете сделать это одним из двух способов.
my $ref_hash = \%hash;
или создать анонимный ссылочный хеш
my $ref_hash = {
key => value,
key => value
}
Теперь, чтобы получить доступ к этому хэшу, вам нужно отменить ссылку на переменную или использовать синтаксис стрелки.
Пример 1 (синтаксис стрелки)
print $ref_hash->{key};
Пример 2
print ${$ref_hash}{key};
Надеюсь, это поможет.