#daiizメモ

Scrapboxに夢中

perl: ハッシュの扱い方

perl自習メモです。

ハッシュを定義する

# ハッシュ
my %ha = (id => "daiz", blog => "hatena");

太い矢印=>はカンマ,に置き換えても良い。

ハッシュを関数の引数に渡す

\をくっつけてリファレンスを作成して渡す。

printhash(\%ha);

最初からリファレンスとして定義する

ハッシュをリファレンスとして作成する方法
( )ではなく、{ }を用いる。%ではなく、$になる。

# ハッシュのリファレンス
my $hr = {id => "daiz", blog => "hatena"};

ハッシュを関数の引数に渡す②

そのまま渡してOK.

printhash($hr);

ハッシュの中身を表示する①

ここで示す方法だと、表示される順番は実行するまで分からない。
関数の0番目の引数の値は@_[0]で取得できる。shiftとしても良い。
ハッシュのリファレンスが渡されているので、%デリファレンスする。

sub printhash {
  my $self = @_[0];
  while (my ($key, $val) = each(%{$self})) {
    print "$key:  $val\n";
  }
}

ハッシュの中身を表示する②

今度はハッシュのキー配列を辞書順にソートしてから表示する例。
この方法だと、ハッシュの中身の表示順番は一意に定まる。
引数に与えられたハッシュのリファレンスをデリファレンスした後、keysでキー配列を得て、sortでソートする。

sub printhash_with_sort {
  my $self = shift;
  my %hash = %{$self};
  my @keys = sort keys %hash;
  for my $key (@keys) {
    print "$key:  $hash{$key}\n";
  }
}

forループで$keyを1つずつ見て、ハッシュから対応する値を取り出す。
$keyを指定してハッシュの値を取り出すには$hash{$key}とすればよい。

ハッシュの中身を表示する③

受け取ったリファレンスをデリファレンスしなくても、$keyを指定してハッシュの値を取り出すことができる。 $selfはハッシュのリファレンスであるとき、$hash->{$key}とすれば$keyに対応する値を取得できる。

sub printhash_with_sort {
  my $self = shift;
  my @keys = sort keys %{$self};
  for my $key (@keys) {
    print "$key:  $self->{$key}\n";
  }
}