Как я могу ссылаться на хеш с именем переменной? - PullRequest
3 голосов
/ 06 августа 2009

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

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

Ответы [ 2 ]

17 голосов
/ 06 августа 2009

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

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

  # ...

}
1 голос
/ 07 августа 2009

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

my $ref_hash = \%hash;

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

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

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

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

print $ref_hash->{key};

Пример 2

print ${$ref_hash}{key};

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...