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

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

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


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


Ответы (2)


Это должно сработать для вас.

#!/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';

  # ...

}
person Brad Gilbert    schedule 06.08.2009
comment
Много-много +1 за то, что не показали OP, как использовать символические ссылки ;-) perldoc.perl.org/ ... Новички часто думают, что они хотят, чтобы переменная содержала имя переменной. - person Sinan Ünür; 06.08.2009
comment
Извините за добавление страшной версии с символическими ссылками :-( - person Brad Gilbert; 07.08.2009
comment
Хотя, надеюсь, я показал проблему с этим. - person Brad Gilbert; 07.08.2009
comment
почему это такой распространенный вопрос? Где это используется, считается хорошей идеей? - person MkV; 08.08.2009

Чтобы сослаться на хэш по ссылке, вы можете сделать это одним из двух способов.

my $ref_hash = \%hash;

или создать анонимный ссылочный хеш

my $ref_hash = { 
    key => value, 
    key => value
}

Теперь, чтобы получить доступ к этому хэшу, вам нужно отменить ссылку на переменную или использовать синтаксис стрелки.

Пример 1 (синтаксис стрелки)

print $ref_hash->{key};

Пример 2

print ${$ref_hash}{key};

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

person Logan    schedule 06.08.2009
comment
Вопрос был об использовании символических ссылок. - person Brad Gilbert; 07.08.2009
comment
@Brad: вопрос в том, чтобы выполнить работу. Я уверен, что он был бы счастлив использовать все, что работает. :) - person brian d foy; 07.08.2009