2012-08-07 2 views
15

내가 보여주는 다음과 같은 코드를 찾고 있어요 중첩 된 해시 :일부 해시는 중괄호를 사용하여 초기화되고 일부는 괄호로 초기화되는 이유는 무엇입니까?

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 호선), 서브 해시는 중괄호를 사용하여 초기화되는 반면, 괄호를 사용하여 초기화 ?

파이썬 배경에서 오는 것은 필자는 펄이 아주 이상하다고 말해야한다. :).

답변

21

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" }); 

은 그리고 그입니다.

+4

을 제공하기 위해 편집 한'KEY3 => \ %의 foo'은 참조를 추가합니다 사람이 의도하는대로 할 수있는 아주 간단한 방법입니다. 그 상황에서. –

2

먼저 괄호는 아무 것도하지 않고 우선 순위를 변경합니다. 그들은리스트 생성, 해시 생성 또는 해시 초기화와 아무 관련이 없습니다. 당신은

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

, 해시 생성 연산자의 피연산자 주위에 괄호를 사용할 수 있으며 우선 순위가 있습니다 때 당신은 할당 연산자의 피연산자 주위에 괄호를 생략 할 수 있습니다.

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

둘째, 하나 { }를 사용하여 해시를 초기화하지 않는다; 하나는 그것을 사용하여 해시를 만듭니다. { }은 해시가 익명임을 제외하고는 my %hash;과 같습니다. 즉,

{ EXPR } 

기본적

do { my %anon = EXPR; \%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, 
); 
6

본질적인 차이 (...) 해시를 생성하는데 사용된다 작성할 수있다. {.... ....} 해시 조금 더 상세히 참조

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

를 생성하는데 사용된다 - 익명 해시한다} ... {과 스칼라에 asigned된다 느릅 나무에 대한 참조를 반환 $hash_ref

그것이 KEY3 => %의 foo` 그것은, 보이는하지 않는 '것이 사실이지만 ... 그냥 완전성에 대한 좀 더 세부

관련 문제