20

ネストされたハッシュを示す次のコードを見ています。

my %HoH = (
    flintstones => {
        husband   => "fred",
        pal       => "barney",
    },
    jetsons => {
        husband   => "george",
        wife      => "jane",
        "his boy" => "elroy",  # Key quotes needed.
    },
    simpsons => {
        husband   => "homer",
        wife      => "marge",
        kid       => "bart",
    },
);

最上位のハッシュ (行 1 から始まる) は括弧を使用して初期化されるのに、サブハッシュは中括弧を使用して初期化されるのはなぜですか?

Python のバックグラウンドから来て、Perl はかなり奇妙だと言わざるを得ません :)。

4

3 に答える 3

30

Perl のバックグラウンドを持つ私は、Perl も非常に奇妙だと思います。

括弧を使用してハッシュ (または配列) を初期化します。ハッシュは、一連の文字列と一連のスカラー値の間のマップです。

%foo = ( "key1", "value1",  "key2", "value2", ... );   #  % means hash
%foo = ( key1 => "value1",  key2 => "value2", ... );   # same thing

中括弧は、ハッシュ参照を定義するために使用されます。すべての参照はスカラー値です。

$foo = { key1 => "value1", key2 => "value2", ... };    #  $ means scalar

ハッシュはスカラー値ではありません。ハッシュの値はスカラーでなければならないため、ハッシュを別のハッシュの値として使用することはできません。

%bar = ( key3 => %foo );     # doesn't mean what you think it means

しかし、ハッシュ参照はスカラーであるため、ハッシュ参照を別のハッシュの値として使用できます。

$foo = { key1 => "value1", key2 => "value2" };
%bar = ( key3 => $foo );
%baz = ( key4 => { key5 => "value5", key6 => "value6" } );

そのため、リストのリストを中括弧で囲んだ括弧が表示されます。

于 2012-08-07T05:39:50.457 に答える
9

本質的な違い (....) は、ハッシュの作成に使用されます。{....} は、ハッシュ参照を作成するために使用されます

my %hash  = ( a => 1 , b => 2 ) ;
my $hash_ref  = { a => 1 , b => 2 } ;

もう少し詳しく説明すると、{....} は匿名ハッシュを作成し、スカラーに割り当てられた参照を返します。$hash_ref

もう少し詳細を与えるために編集された

于 2012-08-07T07:54:49.210 に答える
6

まず、親はここで優先順位を変更するだけです。リストの作成、ハッシュの作成、ハッシュの初期化とは何の関係もありません。

たとえば、次の2行は100%同等です。

{   a => 1, b => 2   }
{ ( a => 1, b => 2 ) }

たとえば、次の2行は100%同等です。

sub f { return ( a => 1, b => 2 ) }    my %hash = f(); 
sub f { return   a => 1, b => 2   }    my %hash = f(); 

{ }次に、 ;を使用してハッシュを初期化することはありません。それを使用してハッシュを作成します。ハッシュが匿名であることを除いて、{ }と同等です。my %hash;言い換えると、

{ LIST }

基本的には

do { my %anon = LIST; \%anon }

(ただし、字句スコープは作成されません)。

匿名のハッシュにより、書き込みが可能になります

my %HoH = (
    flintstones => {
        husband   => "fred",
        pal       => "barney",
    },
    jetsons => {
        husband   => "george",
        wife      => "jane",
        "his boy" => "elroy",
    },
    simpsons => {
        husband   => "homer",
        wife      => "marge",
        kid       => "bart",
    },
);

それ以外の

my %flintstones = (
    husband   => "fred",
    pal       => "barney",
);
my %jetsons = (
    husband   => "george",
    wife      => "jane",
    "his boy" => "elroy", 
);
my %simpsons = (
    husband   => "homer",
    wife      => "marge",
    kid       => "bart",
);
my %HoH = (
    flintstones => \%flinstones,
    jetsons     => \%jetsons,
    simpsons    => \%simpsons,
);
于 2012-08-07T06:00:36.540 に答える