- リスト(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は、引数を指定しない場合、$_の値を出力する }