読者です 読者をやめる 読者になる 読者になる

tweeeetyのぶろぐ的めも

アウトプットが少なかったダメな自分をアウトプット<br>\(^o^)/

【perl】ハッシュスライスでいろいろやる(2つの配列をマッピングしてhashに変換、DBレコード的なヤツから任意のkey=>valueに変換)

はじめに

以前、perlのリスト(配列)の基本について書きました。(hashについては書いてないかも)

上記の記事とはあまり関係ないですし今更間はありますが、
今回はhash(ハッシュスライス)の使い方についてメモ

参考

こちらも参考に

あじぇんだ

  1. ハッシュスライス基本①
  2. ハッシュスライス基本②
  3. ハッシュスライスでDBレコード的なヤツから任意のkey=>valueに変換する
  4. ハッシュスライスで2つの配列をマッピングしてhashに変換する

1. ハッシュスライス基本①

ソース
my %hash = (
  'name' => 'hoge',
  'age'  => 20,
  'sex'  => 1
);
my @keys = ('name', 'age');

# 'name'と'age'についての値をリストで取得
my @values = @hash{@keys};

say @values;
結果
# perl hash_slice_sample.pl
hoge 20

2. ハッシュスライス基本②

先ほどは取得するためにmy @keys = ('name', 'age');を宣言して
@hash{@keys};としましたが、当然qw演算子でもいけます。

ソース
my %hash = (
  'name' => 'hoge',
  'age'  => 20,
  'sex'  => 1
);

my @values = @hash{qw/name age/};
say "@values";
結果
# perl hash_slice_sample.pl
hoge 20

こっちのほうがソースがすっきりしますね

3. ハッシュスライスでDBレコード的なヤツから任意のkey=>valueに変換する

ソース
my @members = (
  {'name' => 'hoge', 'age' => 20, 'sex' => 1},
  {'name' => 'fuga', 'age' => 30, 'sex' => 1},
  {'name' => 'piyo', 'age' => 40, 'sex' => 2},
);

my %members_age = map { @{$_}{ qw/name age/ } } @members;
warn Dumper \%members_age;
結果
# perl hash_slice_sample.pl
$VAR1 = {
          'piyo' => 40,
          'hoge' => 20,
          'fuga' => 30
        };
解説

解説するほどでもないですが一応。
map内の@{$_}{ qw/name age/ }の部分がハッシュスライスです。

イメージ
# 1レコード目のhashがデフォルト変数`$_`に格納される
$_ = {'name' => 'hoge', 'age' => 20, 'sex' => 1}
↓ 

# 格納されたhashに対してハッシュスライス。
@{$_}{ qw/name age/ }# ハッシュスライスされると`'hoge' => '20'`が左辺のhashに格納される。
my %members_age = map { @{$_}{ qw/name age/ } } @members;

4. ハッシュスライスで2つの配列をマッピングしてhashに変換する

こちらはソースみたほうが早いと思うので、さっそく。

ソース
my @keys   = ("name", "age", "sex");
my @values = ("hoge", 20, 1);

my %hash;
@hash{@keys} = @values;

say Dumper\%hash;
結果
# perl hash_slice_sample.pl
$VAR1 = {
          'name' => 'hoge',
          'sex' => 1,
          'age' => 20
        };

まとめ

タイプも減るし慣れるとわかりやすいのでイイですよね。ハッシュスライス

初めてのPerl 第6版
初めてのPerl 第6版
posted with amazlet at 14.09.15
Randal L. Schwartz brian d foy Tom Phoenix
オライリージャパン
売り上げランキング: 23,310