perl に関する (ほとんど自分のための) 備忘録です。 たまにちょっとしたものを書くだけなので、いつになっても perl には慣れることができず、すぐに忘れてしまいます。 (タイトルは Unix Magazine に連載されていた「ワークステーションのおと」のマネです。)
ワードリスト
デリミタは変更可 (「/」、「(」、「<」、…)
qw(a b c) qw/a b c/ # どちらも ('a', 'b', 'c')
裸のワードはクオート文字列として扱われる
(Mon, Tue, Wed, Thu, Fri) # → qw(Mon Tue Wed Thu Fri)
s/// 等に使ってもオッケー。
s {before} (after)g; # 異なるデリミタオッケー。最後以外空白もオッケー。
スコープの指定
my ローカル変数 our グローバル変数:スコープを抜けても値がリストアされない local グローバル変数:スコープを抜けると値がリストアされる
普通は my 使っとく。local はグローバル変数を局所的に変えるとき。
local $/ = ".\n";
とか。
宣言や定義のインポート
use コンパイル時に読み込む require コンパイル時、または実行時に読み込む
まあ、use 使っとけば良いということで (cf. http://www.ndis.co.jp/blog/tech/2008/10/use-require.html)
use MODULE LIST; # LIST が省略されたときは @EXPORT を読み込む
無名の配列、ハッシュへの reference
配列
$a = [a, b, c];
ハッシュ
$h = {a1 => b1, a2 => b2, a3 => b3};
リストと配列は別物
$stuff = ("one", "two", "three"); # $stuff は "three" @stuff = ("one", "two", "three"); $stuff = @stuff; # $stuff は 3
気になる演算子
「->」:デリファレンス 「=>」:カンマの代わり。すぐ左にある識別子は文字列として解釈 「&」:リファレンスを作って関数呼び出しの際に必要
デリファレンス
配列のデリファレンス例
@{$arrayref} ${$arrayref}[0]
ハッシュのデリファレンス例
%{$hashref} ${$hashref}{"key"} @{$hashref}{"key1", "key2"}
いずれもリファレンスを持つ変数をくくる「{}」はブロック
ハッシュとリストコンテキスト
%by_value = reverse %by_key;
%by_key はリストコンテキストなので (key1, value1, key2, value2, key3, value3, …, keyN, valueN) と展開される。 reverse 後は (valueN => keyN, …, value2 => key2, value1 => key1) ということ。
タブ 区切りテキストでの要素の取り出し
my($card_num, $count) = (split /\t/)[1, 5];
添え字 -1 は最後を表す
my($first, $last) = (sort @names)[0, -1];
サブルーチンがらみもろもろ
- サブルーチンへの引数はスカラー値からなる1個のフラットなリスト。戻り値も同様。
- 2個以上の配列やハッシュを引き数として渡すには参照リファレンスを使わなければならない。
- サブルーチンでの引数を受け取るとき、($a, $b, @rest) のように最後の一つだけが配列なのはオッケー。
- @_ の要素を変更すると対応する実パラメータも変更される。
ファイルの一気読み
スカラー変数に代入。
undef $/; $_ = <$fh>;
配列に代入。
@array = <$fh>;
いずれも大きなファイルには向かないらしい。 (cf. http://d.hatena.ne.jp/perlcodesample/20080723/1216823930)
パターン結合演算子
!~ # =~ の反転
範囲演算子
for (0 .. 10) { print; } # 0 ~ 10 を表示 @alphabet = ('A' .. 'Z'); @foo[-5 .. -1] # 最後の 5要素
繰り返し演算子 x
(1) x 4 # (1, 1, 1, 1) または "1111"
ハッシュのもろもろ
@hash{@keys} = ("") x @keys; # ハッシュ初期化。ハッシュスライス利用 scalar(keys (%HASH)) # 登録済みキーの個数
その他
use strict; use warnings;
は必須だよね。
置換時関数呼び出し
s/([0-9]+)/sprintf("%#x", $1)/ge; # 16進へ変換。/e を使えばオッケー