『初めてのPerl』第3章 リストと配列

  • リスト(list):スカラーの集合に順序を付けて並べたもの
  • 配列(array):リストを格納する変数

PHPの世界では何でもかんでも「配列(array)」だけど、Perlの世界では中身(リスト)と容れ物(配列)を区別する。たぶんPHPの方が異端。

配列とスカラー変数の名前空間は衝突しない:

#!/usr/bin/env perl
use v5.12;
use warnings;
my $var;
my @var;
$var = 'hoge';
$var[0] = 'fuga';
print $var, "n"; # hoge
print $var[0], "n"; # fuga

範囲演算子(PHPだとrange()):

#!/usr/bin/env perl
use v5.12;
use warnings;
my @range;
@range = (1..10); # @rangeに1から10までを格納したリストが入る
foreach (@range) {
say; # 1から10まで改行しながら出力
}

qwショートカット:qwとデリミタで囲まれ、空白文字列で区切られた文字列は、それぞれシングルクォートで囲まれた文字列とみなされる

#!/usr/bin/env perl
use v5.12;
use warnings;
my @array1;
my @array2;
my @array3;
@array1 = ("hoge", "fuga", "piyo!");
@array2 = qw(hoge fuga piyo!); # 処理の内容は上と同じ
@array3 = qw! hoge fuga piyo! !; # デリミタは任意の記号文字を使える。でエスケープ。
foreach (@array2) {
say; # hoge fuga piyo!
}

リスト代入:リスト値を変数に代入(PHPだとlist()

my ($hoge, $fuga, $piyo) = ('hoge', 'fuga', 'piyo');

pop:末尾から引っこ抜く

#!/usr/bin/env perl
use v5.12;
use warnings;
my @array = 1..9;
my $pop = pop @array; # 9が取り除かれ、$popに代入される
say $pop; # 9
pop @array; # 8が取り除かれる
foreach (@array) {
say; # 1..7
}

push:末尾に突っ込む

#!/usr/bin/env perl
use v5.12;
use warnings;
my @array;
push @array, 0;
push @array, "hoge";
foreach (@array) {
say; # 0, hoge
}

shift/unshift:先頭から引き抜く/先頭に突っ込む

#!/usr/bin/env perl
use v5.12;
use warnings;
my @array = qw(hoge fuga);
my $hoge = shift @array; # "hoge"が引っこ抜かれて$hogeに代入される
say $hoge; # hoge
shift @array; # "fuga"が引っこ抜かれて捨てられる
unshift @array, "piyo"; # "piyo"をリストに追加
my @array2 = qw(foo bar);
unshift @array, @array2; # 2つの配列を合体
foreach (@array) {
say; # foo, bar, piyo
}

なお、配列中の任意の位置から値を取り除いたり、任意の位置に値を挿入する方法として、spliceがある。ただ、spliceは用例が長くなるので省略。

変数展開:配列はダブルクォートで囲まれると変数展開される

#!/usr/bin/env perl
use v5.12;
use warnings;
my @array = qw(fuga piyo);
say @array; # fugapiyo(値の間に半角スペースは入らない)
say "hoge @array"; # hoge fuga piyo (ダブルクォートで囲むと、半角スペースが入る)
say "test@example.com"; # @example という変数を展開しようとしてエラーが出る
say 'test@example.cpm'; # シングルクォートで囲えば変数展開されない

デフォルト変数 $_:Perlは、変数名を指定しない場合、$_をデフォルト変数として使うことが多い

#!/usr/bin/env perl
use v5.12;
use warnings;
my @array = 0..2;
foreach my $val (@array) { # 制御変数 $valを定義
$val += 1; # 制御変数の値を変更すると、元の配列にも影響が及ぶ
}
say "@array"; # 1 2 3
foreach (@array) {
say $_; # 制御変数を指定しないと、$_がデフォルト変数として設定される
say; # printやsayは、引数を指定しない場合、$_の値を出力する
}

コメントをどうぞ

コメントを残す