如何从perl哈希设置标量列表?
use strict;
my $my_hash = { field1=>'val1', field2=>'val2', field3=>'val3', };
my ($field1,$field2,$field3) = %{$my_hash}{qw(field1 field2 field3)};
print "field1=$field1\nfield2=$field2\nfield3=$field3\n";
答案 0 :(得分:4)
您正在寻找一个hash slice,在您的情况下看起来像这样:
my ($field1,$field2,$field3) = @{$my_hash}{qw(field1 field2 field3)};
或者像这样:
my ($field1,$field2,$field3) = @$my_hash{qw(field1 field2 field3)};
如果我们简化了一些事情,以便你使用直接哈希而不是哈希引用,我们可以删除一些噪声,语法看起来会更清晰:
my %my_hash = ( field1=>'val1', field2=>'val2', field3=>'val3' );
my ($field1, $field2, $field3) = @my_hash{ qw(field1 field2 field3) };
# we want an array/list ---------^ ^ ^
# but my_hash is a hash -----------------/ |
# and we want these keys (in this order) ---/
# so we use a qw()-array
然后我们可以通过用通常的方式用hash-ref替换hash来获得你的$my_hash
hash-ref版本。
答案 1 :(得分:0)
以下工作正常:
#!/usr/bin/perl
use warnings;
use strict;
my $my_hash = { field1=>'val1', field2=>'val2', field3=>'val3', };
my ($field1,$field2,$field3) = (values %{$my_hash});
print "field1=$field1\nfield2=$field2\nfield3=$field3\n";
但是,请参阅以下内容,了解为什么效果不佳:
Is Perl guaranteed to return consistently-ordered hash keys?
出现这种情况的一个例子如下:
my $my_hash = { field1=>'val1', blah=>'val1.1', field2=>'val2', field3=>'val3', };
my ($field1,$field2, $blah,$field3) = (sort values %{$my_hash});
print "field1=$field1\nfield2=$field2\nblah=$blah\nfield3=$field3\n";
输出是:
field1=val1
field2=val1.1
blah=val2
field3=val3
请注意,$ field1的值在这里是错误的。由于“亩太短”已经注意到哈希切片是这里的方式,以确保订购是你所期望的,并且不要忘记在所有代码上使用警告。