Я передаю следующий хеш подпрограмме

$VAR1 = {
          'password' => 'abc123',
          'IP' => '172.18.18.122',
          'port' => '8080',
          'username' => 'sensor1'
        };

И я получаю эти результаты, когда использую пользовательский дампер с переменной @_

print Dumper(@_);

Как я могу перебрать пары значений и создать переменные $ IP, $ username ..etc

Я создал

my $variables;
foreach my $key ( keys @_) {
        my $key = @_->{$key}\n";
   }

Но я всегда получаю ошибку.

Type of arg 1 to keys must be hash (not array dereference) at     /perl/modules/Sentinel/Api.pm line 17, near "@_) "
Compilation failed in require at agent line 9.
BEGIN failed--compilation aborted at agent line 9.
1
Deano 27 Апр 2016 в 16:01

2 ответа

Лучший ответ

Вообще говоря, keys должен иметь следующую форму, где %something - хеш, ключи которого вы хотите:

keys( %something )
      ^
      |

@_ содержит ссылку на хэш, поэтому вы можете использовать следующее:

keys( %{ $_[0] } )

Вместо этого мы могли бы дать ему имя:

my ($hash) = @_;

for my $key ( keys( %$hash ) ) {
   my $val = $hash->{$key};
   ...
}

Тем не менее, похоже, вам действительно нужно следующее:

my ($hash) = @_;

my $IP       = $hash->{IP};
my $username = $hash->{username};

...

Если количество ссылок в @_ является переменным, последние два фрагмента становятся

for my $hash ( @_ ) {
   for my $key ( keys( %$hash ) ) {
      my $val = $hash->{$key};
      ...
   }
}

А также

for my $hash ( @_ ) {
   my $IP       = $hash->{IP};
   my $username = $hash->{username};
   ...
}
5
ikegami 27 Апр 2016 в 15:50

Если это действительно хэш, и это все, что вы отправляете, вы можете просто сделать:

my %hash = @_;

... потому что хеш - это просто список пар ключ-значение.

Если вы отправляете одну ссылку на хэш:

my $href = shift;
1
stevieb 27 Апр 2016 в 13:11