2

select_allhashrefmysql クエリで使用して取得したハッシュ (HoH) のハッシュがあります。フォーマットは私が望むものに最適で、同様の方法で他に 2 つの HoH があります。

最終的にこれらの HoH をマージしたいのですが、唯一の問題 (私が思う) は、1 つの HoH の「サブハッシュ」に別の HoH と同じ名前のキーがあることです。例えば

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);

したがって、データをダンプすると、次のような結果が得られます。

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

(これは例なので、異なる名前を持つことは非論理的に見えるかもしれませんが、私はそれが必要です:))

だから私は、またはそのような名前'name'に変更したいと思います。'address_name'これは可能ですか?私はあなたができることを知っています

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

(編集: これはオンラインで見つけた例ですが、テストしていません。)

しかし、その部分をどのように表すかわかりません'id'。何か案は?

4

2 に答える 2

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}
}
于 2012-11-05T19:31:03.440 に答える
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

「apples」のキーを「c」にしたいとします。ハッシュ関数は常に 'a' に対して 02 を返し、'c' に対しては別のものを返すため、単純にキーを 'c' に変更することはできません。そのため、キーを変更したい場合は、値を配列/バケット内の正しい idx に移動する必要もあります。

まあ、違いはないかもしれませんが、それは衝突です。衝突は、ハッシュを実装するときに処理される特殊なケースです。

ハッシュの詳細については、次を参照してください。

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

一般的な言語では、ハッシュ テーブルは内部でどのように実装されていますか?

于 2012-11-05T19:36:33.217 に答える