2013-06-18 4 views
0

나는 이런 식으로 뭔가가있는 경우 :Perl에서 해시를 참조하는 방법은 무엇입니까?

%hash = {foo => 'bar', foo1=>'bar1',}; 

또는

%hash = (foo => 'bar', foo1=>'bar1',); 

또는

$hash = {foo => 'bar', foo1=>'bar1',}; 

또는 위의 코드는 차이가 어떻게

$hash = (foo => 'bar', foo1=>'bar1',); 

? 어떻게 구성 요소에 액세스합니까?

+0

'엄격한 사용을 의미하고, 그 마지막 항목으로 평가하여; ' – friedo

답변

9

(...)은 우선 순위를 정렬하고 {...}은 해시를 만듭니다 참조.

%hash = {foo => 'bar', foo1=>'bar1',}; 

%hash에는 단일 값이 할당됩니다. 그러나 해시에는 키 - 값 쌍의 짝수 크기 목록이 할당됩니다. 귀하의 코드는 hashref의 문자열을 키 (HASH(0x123ABC))로 사용하고 undef을 값으로 사용합니다. 짝수가 아닌 목록을 해시 변수에 할당 할 때 알려주려면 use warnings을 사용하십시오.

%hash = (foo => 'bar', foo1=>'bar1',); 

이 맞습니다. RHS 목록은 목록 컨텍스트에서 평가되고 해시 변수에 할당됩니다. $hash{foo}과 같은 항목에 액세스 할 수 있습니다.

$hash = {foo => 'bar', foo1=>'bar1',}; 

이 맞습니다. 해시 참조는 스칼라 변수에 할당됩니다. $hash->{foo}과 같은 요소에 액세스 할 수 있습니다. 역 참조 화살표은 해시 액세스에서 해시 액세스를 명확히하는 데 필요합니다 (동일한 범위에서 %hash$hash이라는 변수를 모두 가질 수 있음).

$hash = (foo => 'bar', foo1=>'bar1',); 

은 스칼라 문맥에서 RHS의 목록을 평가하고 마지막 값을 할당합니다. 따라서 $hash = "bar1"은 같은 것입니다.하나는 해시 목록을 지정하면

+0

이것들은 단지 예제 일 뿐이며, 괄호 안의 마지막 쉼표는 제거하고, 일부 초보자는이 코드를 실행하여 오류로 끝낼 것입니다. :) –

+1

@HarryBarry 귀하의 우려를 이해합니다. 그러나 후행 쉼표로도 모든 예제는 구문 상 유효하며 "올바르게"실행됩니다. 나는 그것이 필요하지 않을 때 질문에서 형식을 바꾸고 싶지 않았다. – amon

+0

@HarryBarry, 작동합니다. 시도 해봐. 사실 여러 줄에 해시를 쓸 때 멋지거나 대칭 적입니다. – doubleDown

3
  1. 해시에 해시 참조를 할당합니다. 이것은 말이되지 않습니다.
  2. 해시에 목록을 할당합니다. 이것은 일반적으로 해시를 처리하는 방법입니다.
  3. 해시 참조를 스칼라에 할당합니다. 이것이 해시 참조를 일반적으로 처리하는 방법입니다.
  4. 목록을 스칼라에 할당합니다. 마지막 값이 저장 될 것입니다. (3)

    $hash{'foo'} 
    

    가 hashref의 스칼라 값을 액세스하려면 :

(2) 해시의 스칼라 값을 평가하기

$hash->{'foo'} 

참조 perldoc perlref for more about references

3

당신은

my %hash = (key1 => 'value1', key2 => 'value2'); # Hash 

또는

my $hash = { key1 => 'value1', key2 => 'value2' }; # Reference to hash 

하려면, 그것은 키 - 값 쌍의 목록으로 처리하므로 적절한 방법에있다 해시 초기화 :

my %hash = (key1 => 'value1', key2 => 'value2'); 
{ ... } 

그것은 익명의 해시를 생성하고 참조를 반환

do { my %anon = (...); \%anon } 

유사하다. 하나의 참조 키 - 값 쌍의 목록이 아닙니다, 그래서 다음은 아무 의미하지 않는다 : 당신이 해시에 대한 참조를 저장할 않은 경우, 당신은 스칼라에 저장할 것

my %hash = { ... }; # XXX 

합니다.

my $hash = { ... }; # ok 

그래서 할 다음 무엇을, 다음?

my $hash = (a => 'b', c => 'd'); 

음,

a => 'b', c => 'd' 

'a', 'b', 'c', 'd' 

우리가 스칼라에 할당하고 이후를 작성 단지 멋진 방법, 할당 연산자의 오른쪽은 스칼라 컨텍스트에서 평가됩니다. 스칼라 문맥 리터럴 목록 (예컨대 'a', 'b', 'c', 'd')는 그렇게

my $hash = (a => 'b', c => 'd'); 

my $hash = 'd'; 
관련 문제