連想配列の値のリストを返す
values
は、リストコンテキスト (戻り値をリストとして受け取る状況) では、連想配列のすべての値から成るリストを返します。
Perl 5.12 以降では、引数に配列を与えることができ、その場合はその配列の値をそのままリストとして返します。
my %hash = ( taro => 1, jiro => 2, saburo => 3 );
my @vals = values %hash;
print join( ', ', @vals ); # 1, 2, 3
なお、連想配列を引数に与えた場合、values
によって取り出される値の順番は保証されませんので注意してください。
取り出される順番はランダムです。そして、順番を決定するアルゴリズムも Perl のバージョンによって変わる可能性もあります。
そのため、決して values
によって取り出される要素の順番に期待しないようにしてください。
スカラーコンテキスト (戻り値をスカラーとして受け取る状況) では、値の数を返します。
my %hash = ( taro => 1, jiro => 2, saburo => 3 );
my $num = values %hash;
print $num; # 3
values
によって取り出される値は、元の連想配列の値のコピーではなく、元の連想配列の値そのものです。
もしその値を変更すると、元の連想配列の値を変更することになりますので注意してください。
my %hash = ( taro => 1, jiro => 2, saburo => 3 );
for my $val ( values %hash ) {
$val *= 10;
}
print join( ', ', values(%hash) ); # 20, 30, 10
もし元の連想配列の値に影響を与えないようにするなら、次のように values
から得られた値を別の変数にコピーしたうえで変更を加えてください。
my %hash = ( taro => 1, jiro => 2, saburo => 3 );
for my $val ( values %hash ) {
my $copy = $val;
$copy *= 10;
}
print join( ', ', values(%hash) ); # 3, 2, 1