今日のラクダ

ちょっとPerlに関してあやふやなところを整理するために,ラクダ本をじっくり読んでいきます。気になった点のみピックアップする方向で。

2章

2.1.1 コマンド入力演算子(逆クォート演算子) p.94

シングルクォートをデリミタにした場合は,
コマンド文字列に対する変数展開は行われない

main > qx(ps $$);
  PID  TT  STAT      TIME COMMAND

  520  p4  Ss+    0:00.05 /opt/local/bin/perl /opt/local/bin/perlsh



main > qx'ps $$';
  PID  TT  STAT      TIME COMMAND

  522  p4  R+     0:00.01 ps 522

Rubyにはこれに該当する機能はない模様。

2.11.3 ファイル名グロブ演算子 p.98
  • 知らなかった…。けど,もはや使うことはなさそう。globを使う。

3章

3.1 項とリスト演算子 p.104
# chdir($foo) * 20と間違えないように+をつける
chdir +($foo) * 20 # chdir ($foo * 20)

ふつうに括弧を付けた方が分かりやすい。

3.3 オートインクリメント演算子とオートデクリメント演算子 p.107

文字列コンテキストだけで使われ,パターン/^[a-zA-Z]*[0-9]*$/のような変数で適用すると、オーとインクリメント演算子はその値を文字列として増加させる。

RubyのString#succみたいな。

main > ++("hoge");
Error: Can't modify constant item in preincrement (++) at (eval 3) line 1, at EOF

main > $hoge = "hoge";
hoge
main > ++($hoge);
hogf
3.5 記号の単項演算子 p.108

オペランドが識別子ならば,その識別子の先頭にマイナス記号を付けた文字列を返す。

まぁ普通使わないだろうな。

main > -hoge
-hoge
main > -0
0

しかし,~のオペランドが数字でなくて,文字列の場合,全ビットを反転した同じ長さの文字列が返される

main >  ~"abcde"
�����

ビット演算をしっかり理解してないと使いどころがいまいち分からない。

3.7 乗法演算子 p.110

リストコンテキストでは,左オペランドがカッコで囲まれたリストなら、x演算子は,(文字列ではなく)リストを繰り返し複製する。

これはふつうに使いそう。RubyのArray#*と同じ。

main > qw(1 2 3 ) x 5
1
2
3
1
2
3
1
2
3
1
2
3
1
2
3
3.10 名前付き単項演算子とファイルテスト演算子 p.112

リスト演算子は覚える。

名前付き単項演算子の多くは,引数を省くと$_を使うと言う点だ。

ファイルテスト演算子ワンライナーとかシェルスクリプトの代わりをする際に非常に便利そう。-Tオプションが興味深い。RubyのFileTestモジュールには同様のやつはない。必ず-eと併用するようにする。

下線文字1つからなる特別なファイルハンドル(_)をファイルテスト演算子(またはstatかlstat)に与えると,システムコールは行なわずに、前回のファイルテスト(またはstat演算子)が取得したstat構造体の内容を再利用する

使わなそうだけど,とりあえず覚えておく。

4章

4.4.ループ文

continueブロックなんてものがあったのね。Rubyのensureみたいな…。redoとlastを使うと呼び出されないというのはどうなんだろ。

4.5. 裸のブロック

裸のブロックではループ制御演算子が利用可能。

4.6. goto

goto &NAMEという形式は高度に魔術的

難しそう。要復習。

4.7. グローバル宣言
sub count (@); # カッコなしで呼び出せるようになる
sub count (@) { @_ }

sub myname; # リスト演算子として使えるようになる。
sub myname { @_ }
4.8.4 ダイナミックスコープを持つ変数: local

よく見るわかりづらいところ。localの使いどころは一時的にグローバル変数を退避しておきたいときとかでOKだろうか…。例えば,テストコードを実行すると環境変数をテスと環境に設定するとか。

local $ENV{SLEDGE_ENV} = "test_hoge";

次は5章からスタート。やっぱりまとめるの時間かかるなぁ。