第3章 リストと配列 その3 foreach

初めてのPerlシリーズ。配列をひとつひとつ処理するときに素敵な、制御構造foreachについて。

foreachを使うときには、制御変数と値のリストを指定する。

@langs = qw{Ruby Python Java C/C++ Perl LISP};
foreach $lang (@langs) {
    print "$lang\n";
}

この制御変数(ここでは$lang)の扱いが、結構特別。foreach文の内部では、$langはその配列の各要素を直接を指している。コピーを保持してるんじゃないのね。ためしてみると、

@nums = (1,2,3,4,5);
foreach $num (@nums) {
    $num *= 2;
}
print "@nums\n"; # 2 4 6 8 10

となった。たしかに、foreach内では$numを変更しただけに見えるのに、配列そのものが変更されてる。これはこれで便利そうだけど、注意しとかないと何かの拍子にこけそう。

また、制御変数はそれまでにその変数が使われているかどうかとは関係がない。制御変数と同じ名前の変数の値はforeachの直前で保存されて、foreachが終わったときに回復されるらしい。

制御変数は省略できて、その時は制御変数として$_が使われる。このとんでも変数が突然あらわれるあたりがPerlっぽい(気がする)。以下は一番最初の例と同じ。

@langs = qw{Ruby Python Java C/C++ Perl LISP};
foreach (@langs) {
    print "$_\n";
}

せっかくなので、忘れないようにRubyとPythonで配列というかリストのイテレーションも書いてみよう。

# Python
langs = ['Ruby', 'Python', 'Java', 'C/C++', 'Perl', 'LISP']
for lang in langs:
    print lang

# Ruby
langs = %w(Ruby Python Java C/C++ Perl LISP)
langs.each do |lang|
    puts lang
end

やはり、よりすっきりしている印象。こういうことしてると、頭の中ごっちゃにならないか心配です。

初めてのPerl

初めてのPerl

  • 作者: ランダル・L.シュワルツ,トムフェニックス,Randal L. Schwartz,Tom Phoenix,近藤嘉雪
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2003/05
  • メディア: 単行本
  • 購入: 15人 クリック: 474回
  • この商品を含むブログ (294件) を見る