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";
あなたの場合は次のようになるハッシュスライスを探しています:
my ($field1,$field2,$field3) = @{$my_hash}{qw(field1 field2 field3)};
またはこのように:
my ($field1,$field2,$field3) = @$my_hash{qw(field1 field2 field3)};
hash-ref ではなく単純なハッシュを使用するように単純化すると、ノイズの一部を削除でき、構文が少し明確になります。
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
次に、通常の方法でハッシュをハッシュ ref に置き換えることで、ハッシュ ref バージョンに到達できます。
以下は問題なく動作します。
#!/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 が短すぎる」と既に述べたように、ハッシュ スライスは、順序が期待どおりであることを確認するためにここに移動する方法であり、すべてのコードで警告を使用することを忘れないでください。