2012-07-11 1 views
1

이것은 아마도 쉬운 질문 일 수 있지만 알아낼 수는 없습니다. 나는 그것의 데이터를 얻을 수 Perl 해시에서 데이터를 가져 오는 방법에 문제가 있습니까?

$VAR1 = { 
    'date' => 'May 15, 2012', 
    'value' => '0.20' 
}; 

그러나

처럼, 나는 데이터 :: 덤퍼와 함께 인쇄 할 때하는 루틴에서 반환되는 구조를 가지고 보인다. 내가 시도하면 $data{value} 나는 아무것도 얻지 않는다. 나는 Perl에 익숙하지 않다. 누구든지 나를 도울 수 있습니까? 내가 뭘 놓치고 있니?

+2

누락 된 부분은'use strict; 경고를 사용하라. 항상 사용하십시오! – ikegami

답변

6

귀하의 $VAR1는 해시 심판, 단지 해시입니다. 그러나

$$VAR1{date} 
$$VAR1{value} 

, 명시 적 -> 화살표 :

$VAR1->{date} 
$VAR1->{value} 

이 펄입니다 TMTOWTDI 때문에 (이 작업을 수행하는 하나 개 이상의 방법이있다) : 그래서 당신은 데이터를 얻을 수있는 변수 역 참조 할 필요가 연산자는 일반적으로 이해하기 쉽습니다. 왼쪽의 피연산자가 참조이고 오른쪽의 비트가 배열 참조에 대한 $hash->[0] (해시 참조의 경우 $hash->{item})에 액세스합니다.

대신 사용할 수 있습니다

이제
my %VAR2 = ('date' => 'May 15, 2012', 'value' => '0.20'); 

당신이 쓸 수 있습니다 :

$VAR2{date} 
$VAR2{value} 

(I는 모두 %VAR1$VAR1을 사용할 수도, 그들은 서로 다른 변수를 것 —하지만 여분의 혼란입니다.)

1

이것은 서브 루틴 작성 방법에 따라 다릅니다. 나는 당신의 코드는 다음과 같이 뭔가를 검색해야하는 경우 해시에 참조를, 반환 있다고 생각합니다 :

my $data = my_subroutine(); 
print $data->{value}, "\n"; 
0

문제는 당신이 변수의 TYPE을 존중하지 않는 것입니다. Perl은 % sigil로 표시된 해시와 $을 사용하는 해시 참조를 지원합니다. 두 번째는 스칼라이므로 데이터를 가져 오기 위해 참조 해제되어야합니다. 펄의 디버거를 사용 :

DB<1> $VAR1 = { 'date' => 'May 15, 2012', 'value' => '0.20' }; 

DB<2> x $VAR1->{'date'} 
0 'May 15, 2012' 
DB<3> x $VAR1->{'value'} 
0 0.20 
0
#!/bin/perl 
$VAR1 = { 'date' => 'May 15, 2012', 'value' => '0.20' }; 
$date = $$VAR1{date}; 
$value = $$VAR1{value}; 
print "$date\n"; 
print "$value\n" 

인쇄 :

May 15, 2012 
0.20 

이 이유는 $ VAR1이 익명 해시를 참조하기 때문입니다.

관련 문제