Home

技術系のメモと日々の雑感

Perl の配列の要素をシャッフル

他の人が作った Perl のソースを見ていたら目からウロコのロジックを発見。

@array=('hoge','fuga','are','sore');
for($cnt=0; $cnt<@array; $cnt++){
  $idx=int(rand(@array-$cnt));
  push(@array,$array[$idx]);
  splice(@array,$idx,1);
}

何をしているのかすぐには理解できなくてしばらく固まってしまった。
しっかし、要素をランダムに抜き取って配列の末尾に追加するなんてよく思い付くもんだなぁ。
くやしいけど脱帽・・・。

シェバングが #!/usr/bin/env perl

この前のエントリを書いていたときに、何気なく perldoc perlintro を見たら、シェバングの例として

#!/usr/bin/env perl

と書いてあるのを見つけた。
これって??
env は今まで環境変数を表示するときにしか使ったことがなかったので、そもそも引数を取ることすら知らなかった。
それはともかく、perlintro には上のように指定するメリットは特に書かれてなかったので、man env してみたところ、なんとなく分かった。
env の引数に指定されたプログラムは環境変数 PATH を参照して検索されるので、こんな風に書いておけば perl が存在するディレクトリを気にしなくていいということなんだろうね。(多分)
なるほど〜。
perldoc ってよく考えて書かれてるんだなぁ。

Perl のワンライナーについての個人的なメモ

仕事で Perl のワンライナー(One Liner)を利用することがあって、基本的な振る舞いが分かってなかったせいで結構ハマってしまった。
で、個人的に調べた限りでは、サンプルはたくさん見付かるものの、自分がほしかった情報が書かれたサイトがなかったのでまとめておくことにした。
バージョンは v5.8.8 を想定。
自分用に書いているので結構適当だからご注意を。
間違い等に気付いたらコメントでツッコミを入れてもらえると嬉しい。

続きを読む

Perl の配列のインデックスに小数を使うと

自分が書いた Perl のソースをたまたま他の人が見たときに
「配列のインデックスって小数が入っててもいいんですね」
と言われてびっくり。
慌ててソースを見直したら

$MsgStr[$MsgNo/10];

などと書いていて、この $MsgNo が 10 で割り切れないパターンがあるのを見逃していた。
いや、ただ単に int に渡すのを忘れてただけで・・・。
しかし、これでも動くんだなぁ。
この場合、小数部分を無視して int に渡したのと同じ動きをするようだ。
文法的に問題がないかは未確認。
Perl って動かしてみないと分からないことって多いね。
そこがまた面白いんだけど。

Template-Toolkit のタグと改行

Template-Toolkit のタグを埋め込んだテンプレートを見ていたときに、閉じタグの前にハイフンが付いているのを見かけた。

[% hogehoge(); %]
[% hogehoge(); -%]

この2つ目のパターン。
何をしているのだろうと思ってリファレンスを探しても英語のものしか見付からず、説明もよく分からないのでそのまま放置していたけど。(おいおい・・・)
ある日ふと出力された HTML を見て納得。
ハイフンを付けた方では改行が出力されないのか。
普段はブラウザで表示される結果しかチェックしてないし、テンプレートと HTML をじっくり見比べることなんて滅多にないので気づかなかったよ。
影響するのは閉じタグの直後の改行だけで、後に他の記述が続いていたらハイフンを付けても付けなくても結果は同じになるらしい。
Template-Toolkit は整形後の HTML がキレイだと聞いたことがあるけど、こういうところまで考慮されてるからなんだね。