2012-11-05 2 views
2

나는 mysql 쿼리에서 select_allhashref을 사용하여 얻은 해시 (HoH)의 해쉬를 가지고있다. 형식은 내가 원하는대로 완벽하며 두 가지 다른 HoH를 비슷한 방식으로 사용합니다.Perl에서 다른 해시에 해시 키의 이름을 바꿀 수 있습니까?

나는 결국이 HoH를 병합하고 싶다. 내가 가진 유일한 문제는 다른 HoH의 이름과 같은 이름을 가진 HoH의 '하위 해시'에 키가 있다는 것입니다. 예.

$VAR1 = { 
      '57494' => { 
         'name' => 'John Smith', 
         'age' => '9', 
         'height' => '120' 
        } 
     } 
}; 
$VAR1 = { 
      '57494' => { 
         'name' => 'Peter Smith', 
         'address' => '5 Cambridge Road', 
         'post_code' => 'CR5 0FS' 
        } 
     } 
}; 

(이 때문에 다른 이름을 가지고 비논리적 보일 수 있습니다 예를 들어,하지만 난 :) 필요)

을 : 나는 데이터를 덤프 할 때

my $statement1 = "select id, name, age, height from school_db"; 
my $school_hashref = $dbh->selectall_hashref($statement1, 1); 

my $statement2 = "select id, name, address, post_code from address_db";  
my $address_hashref = $dbh->selectall_hashref($statement2, 1); 

그래서 나는 그렇게 같은 결과를 얻을 수

그래서 'name''address_name' 또는 그 이름으로 변경하고 싶습니다. 이것이 가능한가? (이 내가 온라인으로 볼 예를 들어,하지만 테스트하지 않은 편집.)

그러나 나는 내가 'id' 부분을 나타내는 것입니다 방법을 모르는 당신이

$hashref->{$newkey} = delete $hashref->{$oldkey}; 

을 수행 할 수 있습니다 알고 있습니다. 어떤 아이디어?

답변

4

이들을 함께 병합하는 방법을 알지 못하는 경우 가장 쉬운 해결책은 select 문을 변경하여 결과의 ​​열 이름을 바꾸는 것일 수 있습니다. 나중에 해시를 조작하려고하는 것이 아닙니다.

my $statement2 = "select id, name as address_name, address, post_code from address_db";  
my $address_hashref = $dbh->selectall_hashref($statement2, 1); 

그 다음 당신을위한 현실적인 옵션이없는 경우 루프는 당신의 최선의 선택이 될 수

foreach (keys %{$address_hashref}) { 
    $address_hashref->{$_}{$newkey} = delete $address_hashref->{$_}{$oldkey} 
} 
+0

. 좋은 사람! – dgBP

3

당신 때문에 해시가 구현되는 방식의 $hashref->{$newkey} = delete $hashref->{$oldkey};와 함께 할 수 있습니다.

해시 해시로도 할 수 있습니다.

$hashref->{$key_id}{$newKey} = delete $hashref->{$key_id}{$oldKey}; 

해시 함수는 해당 값을 찾아야하는 배열 요소 (슬롯 또는 통)의 인덱스 (해시)에 키를 변환하는 데 사용된다. 여기

은 간단한 예제 :

우리의 해시

{ 
    'a' => "apples", 
    'b' => "oranges" 
} 

의 우리 해시 함수 idx = h(key)를 정의하자 우리의 키의 기능을 사용하여 위의 우리에게 제공합니다 : 그 저장 방법

h('a') = 02; 
h('b') = 00; 

배열 또는 버킷

idx | value 
00 | 'oranges' 
01 | '' 
02 | 'apples' 
03 | '' 
... and so on 

우리는 '사과'의 핵심이 'c'가되기를 바랍니다. 해시 함수는 항상 'a'에 대해 02를 반환하고 'c'에 대해 다른 값을 반환하기 때문에 키를 'c'로 간단히 변경할 수 없습니다. 따라서 키를 변경하려면 배열/버킷의 올바른 idx로 값을 이동해야합니다.

음, 다를 수는 없지만 충돌입니다. 충돌은 해시를 구현할 때 처리해야하는 특별한 경우입니다. 해시에 대한 자세한 정보를 들어

: 완벽

http://en.wikipedia.org/wiki/Hash_table

How are hash tables implemented internally in popular languages?

+0

좋은 해결책과 잘 설명 +1. 열의 이름을 변경하는 것이 더 쉽지만, 작동하지 않으면이를 사용합니다. – dgBP

관련 문제