foreach文配列制御
要素を取り出す
配列の要素の一つ一つを取り出して、それを処理するには他言語では主にforステートメントを使います
もちろんPerlも例外ではなく、基本的にはfor文を使うことができますし
他言語のプログラマならPerlでもfor文を用いる人が多いでしょう
配列の要素の中から指定した数より大きい数を抽出するプログラムを考えて見ましょう
print "指定した数より大きい数を格納する要素の数を抽出します\n";
$var = <STDIN>;
chomp($var);
@array = (0..1000);
$ans = 0;
for ($re = 0 ; $re <= 1000 ; $re++) {
($var < $array[$re]) ? $ans++ : $ans ;
}
print "全部で$ans個検出されました";
forループによって配列の要素をひとつずつ判定しています
もし入力された変数$varよりも要素の値が大きければ$ansに1加算されます
これがもっとも一般的な配列要素の取り出し方法です
一定の数以上の要素を判定、処理する場合はこのようにして配列の要素を抽出して処理します
しかしPerlはこのような処理を専門とするステートメントが存在します
それが foreachステートメント です
foreachは指定した配列の要素を一度指定したスカラー変数に代入します
そして指定した処理を実行して、処理が終わると次の要素に移行して、また同じ変数に代入します
foreach $var (@array) {
statements;
}
ただしここで宣言された$varはforeachループの中だけで存在します
もう少し正確に言うと、foreachステートメントが終了した時点でその変数は消滅します
print "指定した数より大きい数を格納する要素の数を抽出します\n";
$var = <STDIN>;
chomp($var);
@array = (0..1000);
$ans = 0;
foreach $tmpary (@array) {
($var < $tmpary) ? $ans++ : $ans ;
}
print "全部で$ans個検出されました\n";
print "\$tmpary変数 = $tmpary\n";
print "このように、foreachで使われた変数は消滅します";
foreachの部分は、先ほどのforを使ったプログラムと同様の結果を出します
どちらのステートメントを用いるかはプログラマの自由です
しかし、処理内容があまりにも複雑ならばforeachを使ったほうが、幾分読みやすそうですね
豆知識ですが、foreachで指定する配列の要素を格納するための変数は省略可能です
その場合はPerl言語でよく使われる特殊変数 $_ に格納されます
print "指定した数より大きい数を格納する要素の数を抽出します\n";
$var = <STDIN>;
chomp($var);
@array = (0..1000);
$ans = 0;
foreach (@array) {
($var < $_) ? $ans++ : $ans ;
}
print "全部で$ans個検出されました\n";
foreach [$var] (@array) { [statements] }
指定された配列の要素の先頭から$varに代入して、statementsを実行します
ステートメントが実行されると次のインデックスに移り、再びステートメントを実行します
要素の末尾までループすると$varをメモリから開放して次の命令へ進みます
$var 省略可能です。省略した場合は特殊変数 $_ に代入されます。ローカル変数として扱われます
@array 必ず指定します。ここで指定された配列が0番から$varに代入され、要素数だけ繰り返します
statements 省略可能です。実行するステートメントを指定します