こんにちは!
みなさん、Perlをどんなことに使ってますか?私は主に業務でWebアプリケーションを製作する事に使っていますが、実はCGIやWebアプリ製作以外にも結構Perlって使えちゃったりするんですよ!
ってことで、ちょっとした一括処理に使うのに便利なPerlのネタを紹介します。
Perlの中には見た目は似てても違う意味になる演算子っていくつかあるんですが、その中でも(ちょっと古くさいですが)ファイル名グロブ演算子ってのを紹介します。
まず、今まで少しでもPerl触ったことがある方なら大体見たことあるようなコードを書いてみます。
open LOG, "log.txt";
while(<LOG>){
print $_;
}
良く見かけますよね。log.txtをopenで開いてただ表示するだけ。それcatで・・・的な奴ですね。
ベアワード(bareward: $@%&とかが頭に付かない文字列)をファイルハンドルにするとグローバルな名前空間になるので非推奨らしいです。(see also: d:id:tokuhirom:20080601:1212315386) tokuhiromさんthanks!!
my $log_fh;
open $log_fh, "log.txt";
while(<$log_fh>){
print $_;
}
こうやってファイルハンドルを変数に代入するのも同じです。この2つのスクリプトのwhile文で使ってる 『< >』は、ファイルの内容から1行(特殊変数$/とかいじってない場合。詳しくはまたの機会に!)読み込む演算子です。『行入力演算子』っていいます。
これはこれで良く使いますよね。while(<>)とかやった場合は標準入力から読み込んだり。便利。
さて、次はファイル名グロブ演算子の例。
while(<*>){
print $_ . "\n";
}
こんな感じに使います。似てますよね。これ、結果はスクリプトを実行した時のカレントディレクトリのファイルの一覧がずらずらっと出力されます。opendirとかreaddirとかと似たような感じ。で、このファイル名グロブ演算子ってのは結構無茶なリクエストにも答えてくれます。
例えば、iTunesの自分のライブラリ。私は基本的にすべてCDはAACで取り込んでるんですが、初音ミクなんかの音源(初音ミク好きです!)はmp3で配布されてる事が多いのでそのまま入れてます。iTunesは、アーティスト名/アルバム名/曲ってフォルダ構造になっていますので、複数のアーティストにまたがってファイルの一覧が欲しいとき、面倒ですよね!
while(<./"iTunes Music"/*/*/*.mp3>){
print $_ . "\n";
}
./iTunes Music/cosMo@暴走P feat.初音ミク/不明なアルバム/初音ミクの消失 -DEAD END-.mp3 ./iTunes Music/cosMo feat 初音ミク/不明なアルバム/ウタ箱-Vocaloids BOX-.mp3 ./iTunes Music/cosMo feat.初音ミク/不明なアルバム/初音ミクの終焉 -Worst END-.mp3 (略)
こうやればワイルドカードっぽく取得できちゃいます。findとかxargs使えって言われたらもっともですが、これはこれで知ってると便利ですよ。
もちろん、ワイルドカードっぽい挙動なのでこんなことも出来ます。
while(<./"iTunes Music"/*/FINAL*/*>){
print $_ . "\n";
}
./iTunes Music/植松伸夫/FINAL FANTASY 1987-1994/01 SCENE III.m4a ./iTunes Music/植松伸夫/FINAL FANTASY 1987-1994/02 Roaming Sheep.m4a ./iTunes Music/植松伸夫/FINAL FANTASY 1987-1994/03 Theme of Love.m4a (略)
CPANからMusic::Tag::MP3などを入れて、iTunesで管理始める前の気合でフォルダで整理してた時代の曲のImport前に一括でタグ付けとかするときにも結構便利でした。知っておくとちょっと便利かもしれません。
あ、ちなみにこれ、『<*>』じゃなく『glob("*")』とか書けたりしますが、私は『<*>』のが好きです。なんとなく。
PerlはWebアプリ作成に使っても強力な言語ですが、Perlの強力な文字コード取扱いを生かして、MacからもらったZIPファイルが文字化けしちゃった!とか、古いEUCJPなFilesystemだったサーバーのOSを新しくしたから一括でutf8なファイル名に変換したい!とか、そんな自動でやれそうな簡単な仕事なんだけどいちいちツール探すの面倒くさいよ!っとか、convmvで出来るのは知ってるけど入れるのめんどくさい!って場合に使ったりしても便利です。
なんせUNIX系のOSだとまず間違いなく入ってるし、高性能なEncodeモジュールも標準ですしね。
ちょっとした雑用をスマートにこなすために、Perlを始めてみるってのもいいかもしれませんよ!



Leave a comment