4

如何从 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";
4

2 回答 2

5

您正在寻找一个哈希片,在您的情况下看起来像这样:

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

$my_hash然后我们可以通过以通常的方式将哈希替换为哈希引用来获取您的哈希引用版本。

于 2012-12-01T06:49:52.750 回答
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";

但是,请参阅以下内容以了解为什么它不能正常工作:

Perl 是否保证返回一致排序的哈希键?

这种出错的一个例子如下:

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 的值是错误的。由于“mu 太短”已经指出,Hash Slice 是确保排序符合您期望的方式,并且不要忘记在所有代码上使用警告。

于 2012-12-01T06:45:19.970 回答