連想配列からキーのリストを取り出す
keys
関数は、リストコンテキスト (戻り値をリストで受け取る状況) においては、
連想配列を引数に与えると、その連想配列内のキーのリストを返します。
my %hash = (
taro => 23,
jiro => 21,
saburo => 18
);
my @key_list = keys %hash;
print join( ', ', @key_list ); # taro, jiro, saburo
Perl 5.12 以降では、引数に配列を与えることもできます。その場合、その配列内の要素のインデックス番号のリストを返します。 Perl 5.12 より前のバージョンで引数に配列を与えるとエラーになりますので注意してください。
my @array = ( 'taro', 'jiro', 'saburo' );
my @index_list = keys @array;
print join( ', ', @index_list ); # 0, 1, 2
スカラーコンテキスト (戻り値をスカラーで受け取る状況) においては、引数に与えた連想配列または配列の要素の数を返します。
my %hash = (
taro => 23,
jiro => 21,
saburo => 18
);
my $num = keys %hash;
print $num; # 3
なお、連想配列を引数に与えた場合、keys
によって取り出される要素の順番は保証されませんので注意してください。
取り出される順番はランダムです。そして、順番を決定するアルゴリズムも Perl のバージョンによって変わる可能性もあります。
そのため、決して keys
によって取り出される要素の順番に期待しないようにしてください。
順番を固定にしたいなら、キーをアルファベットでソートするのも良いでしょう。
my %hash = (
taro => 23,
jiro => 21,
saburo => 18
);
my @key_list = sort keys %hash;
print join( ', ', @key_list ); # jiro, saburo, taro
もし連想配列の値が小さい順にキーを並べ替えたいなら、このように書くことができます。
my @key_list = sort { $hash{$a} <=> $hash{$b} } keys %hash;
print join( ', ', @key_list ); # saburo, jiro, taro