2011-04-07 6 views
1

난 이미 내가 즉, "미국"때문에 키 'D'로 이전 값을 상실하고Perl에서 첫 번째 키를 잃지 않고 같은 키의 두 값을 해시에 입력 할 수 있습니까?

$hash1{d}="australia"; 

같은 키를 기존에 새 값을 할당하면 펄

%hash1=(a=>"turkey", 
     b=>"india", 
     c=>"england", 
     d=>"usa") 

에 해시를 선언 한 후 내가

print %hash1; 

을 수행 할 때 내가 값이 "미국"... 어떻게 같은 키의 값을 모두 유지하기 위해 참조 해달라고?

답변

12

그 값이 문자열 인 경우, 당신은 한 항목 당에 붙어있는, 그래서 단지 하나의 스칼라 값을 포함 할 수있는 해시 키 키. 그러나 배열 참조 (스칼라 임)를 값으로 저장하는 것을 막을 수있는 방법은 없습니다. 당신은 아마 단지 배열 참조 또는 문자열을 저장해야 상황이 쉽게, 그리고 혼합하는 두 : 홍길동 말했듯이

my %hash1 = (a=>"turkey", b=>"india", c=>"england", d=>"usa"); 

# upgrade all values to arrays 
# $hash1{$_} = [$hash1{$_}] for keys %hash1; # a way with `keys` 
$_ = [$_] for values %hash1; # a better way with `values`, thanks to ysth 

push @{ $hash1{d} }, 'australia'; 

print "$_ : @{ $hash1{$_} }\n" for keys %hash; 
+1

값 % hash1에 대한'$ _ = [$ _] ' – ysth

+0

@ysth => 멋지다. 복사본을 반환하는'keys'와는 달리'values'는 lvalues의 목록을 반환합니다. –

0

당신은 목록

의 해시를 저장해야

예 : http://www.perlmonks.org/?node_id=1977

+3

목록의 해시 같은 것은 없습니다. – friedo

+0

@friedo 언어는 유동적입니다. 단순한 스칼라 대신 배열을 값으로 저장하는 해시를 의미하는 것이 합리적입니다. – Axeman

+1

@friedo :리스트가 아니라면 배열이 보유하고있는 것은 무엇입니까? "알 수없는 컨텐츠 유형의 스칼라 목록을 보유하고있는 배열에 대한 참조를 담고있는 스칼라 해시"를 항상 낭독해야한다는 것이 진드기입니다. 일상적인 대화에서 몇 비트를 남긴 사람들에게는 너무 어려워서는 안됩니다. "배열의 해시"는 Perl이 다른 구현을 가지고 있지 않기 때문에 완벽하게 훌륭합니다. "목록의 해시"는 한 단계가 제거 된 것입니다. 사실, 느긋한 연설에 대한 동일한 논거가 거기에 적용됩니다. 다른 방법이 없기 때문입니다. – tchrist

2

는, 배열의 해시 사용

my %hash1 = (
    a => ["turkey"], 
    b => ["india"], 
    c => ["england"], 
    d => ["usa"], 
); 

과로 사용 :

push @{$hash1{d}}, "australia"; 
0

이 질문은 질문에 정확하게 동일합니다 우리가 처음 하나의 값 일부 특정 값을 저장할 수있는 변수를 할당하지만 나중에인지, 같은 변수에 다른 값을 할당하면 여부 우리는 지금 막 덮어 쓴 초기 값에 접근 할 수 있습니다.

동일한 대답은 모두 허용됩니다. 물론 아니며 저장소 클래스, 액세스 메커니즘 또는 둘 다를 변경하지 않아도됩니다. 하나는 하나를 의미합니다. 단순한 unsubscript 된 스칼라 변수에 대해 작동하는 메커니즘이 생기면, 전체 클래스의 문제에 대해 그렇게했을 것입니다.

관련 문제