Perlの反復・ループの構文には、文字をキーとする順序が保証されない連想配列(≒ハッシュ)や順序が保証される格納順が一意な配列の要素を1つずつ取得可能なforeachループの他、for、do...while/do...untilがあります。
foreach文は、ハッシュとして格納されたハッシュ値や配列の要素をひとつずつ取得しながらハッシュや配列の要素がなくなるまでループします。
ハッシュの場合には、キーとなる文字列を取り出す場合には、 keys 、値を取り出すには values 、両方取り出すには each 関数を利用します。
# 代入例
%hash=("alphabet"=>"abc" , "num"=>"123" , "japanese"=>"あいう" )
# 関数 keys
foreach $key ( keys %hash ) {
print "\$key:$key\n";
print "\$hash{\$key}:$hash{$key}\n";
}
# 関数 values
foreach $value ( values %hash ) {
print "\$value:$value\n";
}
# 関数 each
foreach ( ($key , $value ) = each %hash ) {
print "$key=$value\n";
}
キーとなる値でソートしたい場合には、sort関数を使います。
foreach $key ( sort keys %hash ) {
print "\$hash{\$key}:$hash{$key}\n";
}
尚、この例の場合には、foreach文でカッコ内の式が真の間$keyを1つずつ取得するので、それが有効か否かは別として任意の変数$keyを使わずに直前の値を1つ保持するPerlの特殊な変数$_を利用することもできます。
foreach ( sort keys %hash )
{
"$_\n";
"\$hash{\$_}=$hash{$_}\n";
}
行の終わり(処理の区切り)を示すセミコロンを適切に付加すれば、どんなに長くても1行で記述もできてしまいますが、ワンライナーでない限り、その可読性など有用性を考慮して例えば処理が1つの場合などに1行で記述されることもあります。
foreach $key ( sort keys %hash ) { print "\$hash{\$key}:$hash{$key}\n"; }