Continue(s)

Twitter:@dn0t_ GitHub:@ogrew

PerlでHashのキーを上書きしたい。

あまり利用する機会は少ないがハッシュのキーをリネームさせたいときがたまにある。
特別複雑なことはしないが、さくっと書けなかったのでメモ。

ex) overwrite_hash_key.pl
use strict;
use warnings;

my $hash_1 = {
    apple   =>  120,
    banana  =>  210,
    pear    =>  490,
    grape   =>  310,
};

my $hash_2 = {
    apple     => "りんご",
    banana    => "ばなな",
    pear      => "なし",
    cherry    => "さくらんぼ", 
};

for my $key (keys %{$hash_1} ) {

    # 1. hash_1の新しいkeyをhash_2のvalueから取得(無かったらその項目は飛ばす)
    next unless my $new_key = $hash_2->{$key};
    # 2. hash_1に新しいkeyで挿入
    $hash_1->{$new_key} = $hash_1->{$key};
    # 3. hash_1のいらなくなった方を削除
    delete $hash_1->{$key};

}

while (my ($key, $value) = each( %{$hash_1} )) {
    print "名前:" .$key . "  値段:" ,$value . "\n";
};

【出力結果】

> $ perl overwrite_hash_key.pl
名前:りんご  値段:120
名前:ばなな  値段:210
名前:なし  値段:490
名前:grape  値段:310    <- hash_2には"ぶどう"は設定されていないので更新されない

f:id:taiga006:20171125153944j:plain