Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Как я могу сослаться на хэш с именем переменной?

Автор вопроса: CommunityОтветов: 2

У меня есть три хэша с именами %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
    }
}

Я знаю, что это довольно упрощенный, сравнительно нубский вопрос, поэтому приношу извинения за это.

  • Взгляните на perldoc perlreftut для хорошего введения в ссылки в Perl (как их создавать, как получать из них значения, когда вы можете их использовать). Telemachus 06.08.2009
  • Убедитесь, что вы прочитали perldoc.perl.org/ Sinan Ünür 06.08.2009

hashperl

Ответы

Ответ 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};

Надеюсь, это поможет.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы