初めてのPerl その2(3章)
前回の続き。
3章 リストと配列
- リスト(list)は、スカラーの集合に順序をつけて並べたもの。
- 配列(array)は、リストを保持する変数。
- リストはデータ、配列は変数。
配列(list literal)
$fred[0] = "fr"; $fred[1] = "ed"; $fred = "fred"; print("$fred\n"); # fred print("${fred[0]}${fred[1]}\n"); # fred
- 配列の末尾よりも後ろにある要素に値をセットすると、配列が自動拡張される。
リストリテラル
- リスト値を記述するための表記法。
(1, 2, 3)
、(1, "foo")
範囲演算子(range operator)
qw
(quoted words)ショートカット
- シングルクォートを省略して文字列リストを作成する記法。
qw
+ デリミタ- デリミタは色々使える。以下は全て等価。
("foo", "bar", "foobar") qw!foo bar foobar ! qw#foo bar foobar # qw(foo bar foobar ) qw{foo bar foobar } qw[foo bar foobar ] qw<foo bar foobar >
リスト代入
- 変数にリスト値を一括でセットする方法。
($x, $y, $z) = ('foo', 'bar', 'foobar');
- 右辺のリストは代入を行う前に作成される。
($x, $y) = ($y, $x); # swapはこれでOK。
- リストの変数の個数 < 値の個数 の場合、余った値は切り捨てられる。
- リストの変数の個数 > 値の個数 の場合、余った変数は
undef
となる。
リスト代入のより簡単な書き方
- 配列の前に
@
をつける。 @
は「〜全体」の意。
@foobar = qw/ foo bar /; @void = (); # 空リスト @five = 1..5; # 5個の要素を持つリスト $hoge = "hoge"; @ary = (@foobar, "foobar", $hoge); #→ "foo" "bar" "foobar" "hoge" @copy = @ary # リストのコピー
要素の出し入れ*1
@array = 1..3; @array2 = qw/ 5 6 /; push(@array, 0); # @array : (1, 2, 3, 0) push @array, @array2; # @array : (1, 2, 3, 0, 5, 6) $fact = pop(@array); # $fact : 6、 @array : (1, 2, 3, 0, 5)
配列を文字列の中に展開する
- ダブルクォートの中に入れるとスペース区切り(「
$"
」のデフォルト値)で展開される
@array = 1..4; print "@array" . "\n"; # → 1 2 3 4
foreach制御構造*2
- 配列のループ
foreach $foo(qw/ 1 2 3 /) { print "$foo.\n"; }
- 制御変数(
$foo
)はリストの要素を参照している。 - 制御変数を変更すると、リストの要素も変更される。
@bar = qw/ 1 2 3 /; foreach $foo(@bar) { $foo .= 1 . " "; } print @bar; # (11 21 31)
デフォルト変数$_
- 変数や値を指定しなかった時に自動的に使用される変数
foreach
やprint
など。
foreach (1..10) { print "count $_\n"; } $_ = "foobar"; print;
reverse
演算子
- 配列を逆順にしたものを返す。
- 引数で渡した配列が逆順になるわけではない。
@fred = reverse 1..5; # (5, 4, 3, 2, 1) @fred = reverse @fred; # Perlでは右辺が先に計算されるのでこう書ける。
sort
演算子
- 配列を(デフォルトで)ASCIIコード順にソートしたものを返す。
- 引数で渡した配列がソートされるわけではない。
@array = qw/foo bar foobar /; # (foo bar foobar) @sorted = sort @array; # (bar foo foobar)
スカラーコンテキストとリストコンテキスト
- Perlの最重要事項
- Perlでは、文脈によってスカラー値かリスト値かが決まる。
@backwards = reverse qw/ yabba dabba doo /; # doo, dabba, yabba $backwards = reverse qw/ yabba dabba doo /; # oodabbadabbay
- スカラーコンテキスト色々
$foo = something; $foo[3] = something; 123 + something something + 456 if (something) { ... } while (something) { ... } $foo[something] = something;
- リストコンテキスト色々
@foo = something; ($foo, $bar) = something; ($foo) = something; push @foo, something; foreach $foo (something) { ... } sort something reverse something print something
擬似関数scalar
- スカラーコンテキストを強制する。
print "I have ", scalar @pens, " pens.\n"; # リストの数を出力
リストコンテキストの
- ファイルの終わりまでの残りの全ての行を読み込む
@lines = <STDIN>; # 全ての行を読み込む chomp(@lines = <STDIN>); # 改行文字を除いて全ての行を読み込む
以上
今日の分終了><
*1:このへんはJavaScriptのArrayのメソッドと同じ
*2:JavaScriptのArray#forEachのような動き