Perl入門ゼミ

テキスト処理、Linuxサーバー管理、Web開発ならPerl
  1. Perl
  2. 制御構造
  3. 構文
  4. foreach文

foreach - 配列の各要素の処理

配列の各要素を順番に処理するにはforeachを使用します。Perlではwhile文よりも好んで使用されます。

foreach my $item (@array) {
  ...
}

またPerlではforeachはforの別名なので、foreachの代わりにforを使うこともできます。こちらのほうが簡潔でよいと思います。

for my $item (@array) {
  ...
}

要素を順番に出力する方法は以下のページで詳しく解説しています。

サンプル

配列の要素を順番に出力するサンプルです。

# 配列の要素を順番に出力
my @nums = (3, 4, 5);
foreach my $num (@nums) {
  print "$num\n";
}

データ構造が配列のリファレンスの場合に配列の要素を順番に出力するサンプルです。

# 配列の要素を順番に出力(配列のリファレンス)
my $nums = [3, 4, 5];
foreach my $num (@$nums) {
  print "$num\n";
}
2次元配列に含まれる値を行ごとにタブ区切りで出力するサンプルです。join関数を使って配列に含まれる文字列をタブでつなげています。
# 2次元配列に含まれる値を行ごとにタブ区切で出力
my $data = [
  ['a', 1],
  ['b', 2]
];

foreach my $record (@$data) {
  print join("\t", @$record) . "\n";
}

ハッシュの配列に含まれる値を行ごとにタブ区切りで出力するサンプルです。

# ハッシュの配列の含まれる値を行ごとにタブ区切りで出力
my $persons = [
  {name => 'Ken',  age => 19},
  {name => 'Taro', age => 32}
];

foreach my $person (@$persons) {
  my @record = ($person->{name}, $person->{age});
  print join("\t", @record) . "\n";
}

foreachのいくつかのサンプルです。

use strict;
use warnings;

print "[1]\n";
my @persons = ('tom', 'taro', 'sinji');
foreach my $person (@persons){
  print $person, "\n";
}
print "\n";

print "[2]\n";
my @numbers = (1, 2, 3);
foreach my $number (@numbers){
  # $numberに渡されるのは、要素の別名なので、配列そのものの値を変更できる。
  $number = $number * 2;
}
print "\@numbers = (", join(',', @numbers), ")\n\n";

print "[3]\n";
foreach my $index (0 .. $#persons){ 
  # 要素番号を使いたい時は、配列そのものの要素を渡さずに、要素番号を渡す。
  print "\$persons[ $index ] = $persons[ $index ]\n";
}

実行結果

[1]
tom
taro
sinji

[2]
@numbers = (2,4,6)

[3]
$persons[ 0 ] = tom
$persons[ 1 ] = taro
$persons[ 2 ] = sinji
Giblog