Perl - 如何在循环@_变量时创建变量

Dea*_*ano 1 perl

我将以下哈希传递给子例程

$VAR1 = {
          'password' => 'abc123',
          'IP' => '172.18.18.122',
          'port' => '8080',
          'username' => 'sensor1'
        };
Run Code Online (Sandbox Code Playgroud)

当我用@_变量用户Dumper时,我得到了这些结果

print Dumper(@_);
Run Code Online (Sandbox Code Playgroud)

如何遍历值对并创建变量$ IP,$ username ..等

我创造了

my $variables;
foreach my $key ( keys @_) {
        my $key = @_->{$key}\n";
   }
Run Code Online (Sandbox Code Playgroud)

但我总是得到一个错误.

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.
Run Code Online (Sandbox Code Playgroud)

ike*_*ami 5

一般来说,keys应该有以下形式,其中%something是您想要的键的哈希:

keys( %something )
      ^
      |
Run Code Online (Sandbox Code Playgroud)

@_ 包含对哈希的引用,因此您可以使用以下内容:

keys( %{ $_[0] } )
Run Code Online (Sandbox Code Playgroud)

相反,我们可以给它一个名字:

my ($hash) = @_;

for my $key ( keys( %$hash ) ) {
   my $val = $hash->{$key};
   ...
}
Run Code Online (Sandbox Code Playgroud)

也就是说,听起来你真的想要以下内容:

my ($hash) = @_;

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

...
Run Code Online (Sandbox Code Playgroud)

如果引用的数量@_是可变的,则最后两个片段变为

for my $hash ( @_ ) {
   for my $key ( keys( %$hash ) ) {
      my $val = $hash->{$key};
      ...
   }
}
Run Code Online (Sandbox Code Playgroud)

和

for my $hash ( @_ ) {
   my $IP       = $hash->{IP};
   my $username = $hash->{username};
   ...
}
Run Code Online (Sandbox Code Playgroud)