2013-08-26 3 views
0

각 키에 대해 HoAs와 루프를 만드는 코드를 작성 중입니다. 아래 스 니펫은 내가 겪고있는 문제의 기본 예를 보여줍니다.이미 존재하는 키 수정

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

my @array1 = qw (1 1 3 4 5); # Note that '1' appears twice 
my @array2 = qw (a b c d e); 
my @array3 = qw (6 7 8 9 10); 
my @array4 = qw (f g h i j); 

my %hash; 
push @{$hash{$array1[$_]}}, [ $array2[$_], $array3[$_], $array4[$_] ] for 0 .. $#array1; 

for my $key (sort keys %hash) { 
    my ($array2, $array3, $array4) = @{$hash{$key}[-1]}; 
    print "[$key] $array2\t$array3\t$array4\n"; 
} 

출력 : 난 그냥 실현 고유하지 않은 한 키를 사용하고있다 (이 예 반대), 그래서 실제로 사용하고 데이터에 대한

[1] b 7 g 
[3] c 8 h 
[4] d 9 i 
[5] e 10 j 

, 위와 같이 non-uniqe 키를 오버라이드합니다. 나중에 이들 값을 정렬하기 위해 키로 주로이 값을 사용하고 있습니다.

내 질문은 다음 중 하나

A) 나는 그것을

또는

B를 수정할 수있는 경우에 각 키 unless (exists $hash{$array1})에 대해 위의 작업)을 수행 할 수 있습니다에 의해 정렬하는 방법이 있나요 그 값들은 다른 비 중복 키를 사용할 수 있습니다.

감사합니다.

답변

2

때문에, 위와 같이 나는 오버라이드 (override)가 아닌 누구와도 바꿀 수없는 다이애나 키

당신이하지를 끝낸다. 의 그 해시의 전체 내용을 인쇄하자

for my $key (sort { $a <=> $b } keys %hash) { # sort numerically! 
    for my $array (@{ $hash{$key} }) {   # loop over all instead of $hash{$key}[-1] only 
    say "[$key] " . join "\t", @$array; 
    } 
} 

출력 :

[1] a 6  f 
[1] b 7  g 
[3] c 8  h 
[4] d 9  i 
[5] e 10  j 

당신은

$hash{$array1[$_]} = [ $array2[$_], $array3[$_], $array4[$_] ] for 0 .. $#array1; 

같은 해시를 구축하는 (그리고 그것을 인쇄하는 경우 값을 오버라이드 (override) 할 것 as)

for my $key (...) { 
    say "[$key] " . join "\t", @{ $hash{$key} }; 
} 

즉, push 대신에 할당.

각 키에 할당 된 첫 번째 값을 유지하려면 //= 연산자를 사용하십시오 (undef 인 경우 할당).

+0

@FlyingFrog 종류입니다. 각 해시 키는 여러 값을 가질 수 있으므로 먼저 해당 키를 실제로 정렬하는 항목으로 배분해야합니다. 'my @actual_stuff; 내 $ 키 (키 해시 키) {내 $ val (@ {$ hash {$ key}}) {push @actual_stuff, [$ key, @ $ val]}}'에 대해. 그런 다음,'@ array3'의 값은 결과 항목의 인덱스 2에 있습니다 :'sort {$ a -> [2] <=> $ b -> [2]} @ actual_stuff'. – amon

관련 문제