ASとか

開発系の記事が多めです。タイトルのASはActionScriptの略です。

リストと配列

基本

  • リスト
  • 配列
    • リストを格納する変数

配列へのアクセス

  • $hoge[0] = "hoge";
  • $hoge[n]と$hogeは別の名前空間に置かれる
  • 添字が配列の末尾より後ろを指した場合はundef
  • 配列の末尾より後ろに値をセットした場合、飛ばした中間の要素にはundefがセットされる
  • 最後の要素にアクセスするためには負数を使う
    • $hoge[-1]
    • これで末尾の一つ手前を取得できるけどあまりやりたくない($hoge[-2])

リストリテラル

  • (1, 2, 3)
  • ("hoge", 4.5)
  • ()
    • 空リスト
  • (1..100)
    • 100個の整数リスト

qwショートカット

  • qw(hoge fuga piyo)
    • 文字列のリストが作成できる
    • 各要素はシングルクォートで囲まれている扱いなので注意(\nとか)
  • 要素間の空白文字は捨てられるので、改行とか入れつつ読みやすくできる
  • qw後の()は別になんでもいい
    • qw{ }
    • qw/ /
    • qw! !
  • 要素内にこのデリミタを入れたい場合はエスケープする
    • qw( hoge\) fuga piyo )
    • qw! hoge\! fuga piyo !

リスト代入

  • リスト値を変数に代入
    • ($hoge, $fuga, $piyo) = ("hoge", "fuga", piyo);
    • 変数の数が余分にあればundefが代入され、リスト値が多ければ捨てられる
  • 関数の引数受け取りとか便利
    • my ($hoge, $fuga, $piyo) = @_;
  • 変数の値交換も便利

配列全体を表す@

  • @hoges = qw/ hoge hoge hoge /;
  • @words = (@hoges, fuga, piyo); #hogesは展開される
  • @empty = (); #@emptyをさらにリストに入れても無いのと同じ(undefが入ったりはしない)
  • @hoges = qw/ hoge undef hoge /; #明示的にundefを入れる

配列の先頭or末尾の要素を操作

  • 末尾の要素を取り除く
    • $fred = pop(@array);
  • 末尾に要素を追加
    • push(@array, 0);
  • 先頭の要素を取り除く
    • $m = shift @array;
  • 先頭に要素を追加
    • unshift(@array, 5);

配列を文字列に展開

  • スカラー変数と同じくダブルクォーテーション内で展開できる
    • "@array"
  • 文字列として@arrayを入れたい
    • "\@array"
    • '@array'

foreach

# 制御変数を明示的に指定
foreach $word (qw/ hoge fuga piyo /) {
    print "$word\n";
}

# デフォルト制御変数を使用
foreach (qw/ hoge fuga piyo /) {
    print "$_\n";
}

# 制御変数は値コピーではないので
# ループ中に対象のリストの中身を操作できる
@words = qw/ hoge fuga piyo /;
foreach (@words) {
    $_ .= "\n";
}

並び替え

# 逆順を取得
print reverse(1..10)."\n";

# デフォルトのソート(ASCIIコード順)
# ソート条件は他にも指定できる
@words = sort(qw/hoge fuga piyo/);
print "@words\n";

スカラーコンテキストとリストコンテキスト

  • 式が置かれている位置によって意味が変わる
  • コンテキスト == 式が置かれている場所を示す概念
  • Perlが式を解析する場合はスカラー値かリスト値のどちらかを期待する
    • 例外もある
  • コンテキストによって評価が変わる例
# リストの個数を返す
$n =  @array;
3 + @array;

# 文字列を逆順にして返す
reverse($hoge);
  • スカラーコンテキストを強制するscalar関数
    • リストコンテキスト強制関数は無い、必要ないとのこと
@array = qw/ a b c /;

# 配列の中身を表示する
print "string :", @array, "\n";

# 配列の要素数を表示する
print "number :", scalar @array, "\n";

リストコンテキストで

# 次の1行
$line = <STDIN>;

# 全ての行
@lines = <STDIN>;

# 全ての行を読み込み
# 各要素から改行を取り除く
chomp(@lines = <STDIN>);