2013-09-05 7 views
4

다음 Perl 코드는 Value:0을 인쇄합니다. 해시 참조가 서브 루틴으로 전달되기 전에 해시에 더미 키를 추가하는 것 이외의 방법으로 해결할 수 있습니까?perl에서 해시 참조 초기화

#!/usr/bin/perl 
use warnings; 
use strict; 

my $Hash; 

#$Hash->{Key1} = 1234; 

Init($Hash); 

printf("Value:%d\n",$Hash->{Key}); 

sub Init 
{ 
    my ($Hash) = @_; 
    $Hash->{Key}=10; 
} 

답변

3

빈 해시 참조를 초기화하십시오.

#!/usr/bin/perl 
use warnings; 
use strict; 

my $Hash = {}; 

Init($Hash); 

printf("Value:%d\n",$Hash->{Key}); 

sub Init 
{ 
    my ($Hash) = @_; 
    $Hash->{Key}=10; 
} 
+4

나는 그의 원래 프로그램이 작동하지 않은 이유를 설명하는 경우이 투표했을 것이다. – cjm

+0

의견에 감사드립니다. 이것에 아주 새롭기 때문에 나는 그것을 명심해야한다. –

2

나는 대답이 이미 승인되었습니다,하지만 난 프로그램이 처음부터 이런 식으로 행동하는 이유는 을 설명하는 가치라고 생각 했어요.

해시는 Init 함수의 두 번째 줄 ($Hash->{Key}=10)까지 생성되지 않습니다.이 함수는 자동으로 해시를 만들고 $Hash 스칼라에 참조를 저장합니다. 이 스칼라는 함수의 지역 변수이며 스크립트 본문의 $Hash 변수와 아무 관련이 없습니다.

Init 함수가 인수를 처리하는 방식을 수정하여 변경할 수 있습니다

sub Init { 
    my $Hash = $_[0] = {}; 
    $Hash->{'Key'} = 10; 
} 
+0

해시 참조가 초기화되지 않은 경우 서브 루틴으로 전달되는 내용은 무엇입니까? – Jean

+0

@Jean 그냥 정의되지 않은 스칼라를 보내는 중입니다. 아무것도 참조하지 않습니다. – AKHolland