カテゴリー
Perl

foreach文を理解しよう

この章ではforeach文について説明します。
今までは次のように1つずつ配列からデータを取り出していましが、foreachを使うとすべての配列の要素を簡単に取り出すことができます11
では例をみてみましょう。
11foreachは、リストや配列の一番前から順番に$an変数にセットされて、ブロックの中身である文を実行します。
配列やリストの要素がすべてを変数に出力されたら繰り返しが終了します。
111111では例をみてみましょう。

1最初の例では配列の要素をただ単に出力しただけですが、この例の場合には$anに1を連結演算子で付けて出力しています。
11と同じ意味です。
このようにforeach内で配列の要素に変更を加えると元の配列まで影響を受けます。
試しに1と出力すると分かりますが1のように元の配列の要素まで変わっているのが分かります。
次の例をみてみましょう。
1結果は12です。
プロセスは前の例と同じですが、foreachの中の変数である$goukeiを外で出力しています。
このようにブロックの中の変数を外で出力することが出来ます。
注意してほしいのが、この例の1のようにforeach と1の間の変数はブロック外で出力することができません。
この例の場合は$hですが、この変数を制御変数と言います。
この制御変数はブロックの中でだけ有効な変数ですので、ブロックの外で同じ名前の変数を作成しても問題ありません。
では以下の例で確認しましょう。
以下の例の1行目の$anとforeachの$anはお互いに影響を受けません。全く違う変数になります。
1次は制御変数を使わないで配列の要素を出力する方法について説明します。
構文は以下の通りです。
1では次の例を上の構文を使って書き換えてみます。
1以下のように書き替えることも出来ます。
1制御変数を省略した場合は1が制御変数として使われます。
1はデフォルト変数と呼ばれています。
制御変数なので本当は以下の箇所に1が隠れていますが、これは省略できます。
1

次はmap関数について説明します。
foreachに似た関数にmap関数が有ります。
この関数でもforeachと同じことが出来ます。
1では例をみてみましょう。
1map関数は、リストの要素を先頭から順番にブロックの中に代入され、何らかの操作を行った後、その結果をリスト、配列として返してくれます。
この例の場合にはmap関数のブロック内のデフォルト変数に順番に配列の要素が代入していきます。
上の例は以下の例と同じ意味です。
1次の例をみてみましょう。
1配列の各要素が1に代入され、その変数と文字列である1とが文字列連結演算子で連結され、その結果が配列として@gtに代入されます。
結果は以下の通りです。1 次の例をみてみましょう。
1配列の要素がデフォルト変数に代入され、それに1が足されて、その結果が配列として@reに代入されています。
結果は「2 4 5 9 2」です。

次の例をみてみましょう。
以下の形式を添え字を使って書き替えます。
1先ほどの例を添え字を使って書き替えた例が以下です。
1この例の場合は配列を直接指定する代わりに1を使っています。
「$#animal」は末尾の添え字の番号を意味します。
1例えば以下の配列の末尾の添え字番号を求めるには$#animalと書きます
print $#animal;と書けば4が出力されます。
1要素がたくさんある場合は最後の添え字が何番であるかわからなくなりますので、この方法は便利です。
では例の説明に戻りますが、1の中の$anにはリストの0から4の数字が順番に入りますので、結果は1です。
補足ですが、1の他の使い方について説明します。
1この例のように$#animalを添え字に使うことで配列の末尾の要素に新しいデータを入れることが出来ます。
つまり、ネズミをネッシーで上書きしています。
結果は1です。
では次の例も補足ですが、$#animalと同じ意味を表わす添え字について説明します。
1$animal[-1]のように添え字に「-1」を入力することでも配列の末尾の要素にデータを入れることが出来ます。
つまり、$#animalと同じです。
後ろから2番目の要素に何かデータを入れたい場合は以下のように添え字に「-2」を入れてください。
つまり添え字をマイナスで書くことで配列の要素に対して後ろからアプローチできます。1