『初めての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は、引数を指定しない場合、$_の値を出力する
}