地球ウォーカー2

Scala, Python の勉強日記

初めての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)
  • 左のスカラー値から右のスカラー値まで、1ずつ増加する値のリストを生成する。
  • ..で表す。
  • スカラー変数も使える。
    • (1..100)とか($a..$b)とか。
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
  • pop演算子push演算子
    • 配列をスタックとして扱う。
    • リストの右端に対する操作。
@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>); # 改行文字を除いて全ての行を読み込む

以上

今日の分終了><

初めてのPerl
初めてのPerl
posted with amazlet at 09.09.14
ランダル・L. シュワルツ トム フェニックス
オライリージャパン
売り上げランキング: 13789

*1:このへんはJavaScriptのArrayのメソッドと同じ

*2:JavaScriptのArray#forEachのような動き