2017-10-21 2 views
0

미리 정의 된 해시 테이블 집합이 있으며 변수 이름을 사용하여 해시 중 하나를 참조하고 키 값에 액세스하려고합니다. 다음 코드는 해시가 채워지더라도 null을 반환합니다. 여기서 내가 잘못하고있는 것이 무엇인가, 아니면 이것을 달성하기위한 더 좋은 방법이 있습니까?변수 이름을 사용하여 해시를 참조하려면 어떻게해야합니까?

my %hash = (alpha => 'beta', gamma => 'delta'); 

가의 값을 인쇄하려면 :

my $hash_name = 'TEXT'; 

다음 코드는 해시에 할당입니다 :

my %TEXT1 = (1 => 'Hello World',); 
my %TEXT2 = (1 => 'Hello Mars',); 
my %TEXT3 = (1 => 'Hello Venus',); 

my $hash_name = 'TEXT1'; 

my $hash_ref = \%$hash_name; 
print ${$hash_ref}{1}; #prints nothing 
+0

'my $ hash_ref = \ % $ hash_name'이 (가) 예상 한 것을 설명하면 많은 도움이됩니다. – Borodin

+0

hash_ref가 변수 이름으로 정의 된 해시를 참조하도록합니다. 명확한 수정 된 질문입니다. – freeworlder

+0

참고 사항 [정수 인덱스가있는 변수 이름에 접미사가있을 때마다 배열을 대신 사용해야한다는 것을 알게 될 때마다] (https://stackoverflow.com/questions/1549685/how-can-i-use-a-variable -as-a-variable-name-perl). –

답변

3

당신의 해시를 포함하는 해시를 사용해야하는 use strict 'refs'에서 실행되지 않는.

my %texts = (
    TEXT1 => { 1 => 'Hello world', }, 
    TEXT2 => { 1 => 'Hello Mars', }, 
    TEXT3 => { 1 => 'Hello Venus', }, 
) 

my $hash_name = 'TEXT1'; 

print $texts{$hash_name}{1}, "\n"; 
+1

완벽한, 감사합니다! – freeworlder

0

다음 코드는 없습니다 해시로, 스칼라에 할당입니다 해시의 단일 요소라고하면 다음과 같이 말합니다.

print $hash{alpha}, "\n"; 

당신은 그 해시에 대한 참조를 가지고 변수에 그를 할당 할 수

my $hashref = \%hash; 

그리고 그에서 해당 hashref에서 하나의 요소를 인쇄 할 수 있습니다

print $hashref->{alpha}, "\n"; 
+1

이것은 내 질문에 답하지 않습니다. 스칼라 변수에서 가져온 이름으로 해시를 참조하고 싶습니다. 즉, 이미 정의 된 해시 테이블 집합이 있고 사용자 입력에 따라 이러한 테이블 중 하나에서 값에 액세스해야합니다. 따라서 스칼라는 해시 이름을 정의한 다음 그 이름을 사용하여 hash_ref를 정의하려고합니다. 이것이 명확하지 않으면 죄송합니다. – freeworlder

+0

내 편집 된 질문보기 – freeworlder

5

그냥 작품이 코드 잘 *

%TEXT = (1 => abc, 42 => def); 
$name = 'TEXT'; 
print ref($name);   # "" 
no strict 'refs'; 
print ${$name}{1};  # "abc" 
print $name->{42}   # "def" 
$ref = \%$name; 
print ref($ref);   # "HASH" 
print $ref->{1};   # "abc" 
print ${$ref}{42};  # "def" 

당신이 잘못하고있는 주요 것은 making your code an unmaintainable mess이며, 그 이유는 이런 종류입니다 의 내용은 use strict 'refs'에서 허용되지 않습니다.

* - 당신이

+0

'strict'는 코드를 유지 보수 할 수없는 혼란을 막기 위해 존재하지 않습니다. Perl은 프로그램 할 방법에 대한 의견이있을뿐만 아니라 엄격하게 활성화 된 상태에서 프로그램에서 관리 할 수없는 엉망을 만드는 것도 매우 쉽습니다. 그렇지만 엄격한 '심판'을하는 이유는 우연한 실수를 저 지르지 않기 위해서입니다. – Abigail

+0

'strict'를 사용하고 있습니다. 참조 해제없이이 작업을 수행 할 수있는 방법이 있습니까? – freeworlder

관련 문제