[時間割:Perl]『ミニマルPerl』その21
2009/03/09 23:00 posted by kunkichi
1週間って早いなぁ、先週の更新から既に一週間、またがんばらないと、汗
ということで月曜日は「Perl」。引き続き組み込み関数編。ファイルのグロブから。
ミニマルPerl Unix/LinuxユーザのためのPerl習得法
posted with amazlet at 08.10.06
Tim Maher
オライリージャパン
売り上げランキング: 96883
オライリージャパン
売り上げランキング: 96883
- ファイルのグロブ・・・ファイル名をワイルドカード文字で生成する。FNG(File Name Generation)とかともいう。まあ百聞は一見にしかず。
$ ls
GeorgeHarrison.txt JohnLennon.txt RingoStarr.txt
JimmyPage.txt JohnPaulJones.txt RobertPlant.txt
JohnBonham.txt PaulMcCartney.txt
$ perl -wl -e '@files=<Paul*.txt>; print @files;'
PaulMcCartney.txt - 複数の条件を指定する場合は括弧でくくって、カンマで区切る。出力セパレータを改行にすればこういう風に出力される。
$ perl -w -e '$,="\n";@files=( <*John*.txt>, <*Paul*.txt> ); print @files;'
JohnBonham.txt
JohnLennon.txt
JohnPaulJones.txt
JohnPaulJones.txt
PaulMcCartney.txt - ファイルグロブでは<>を使うけど、Perlでは他の用途でも同じ記号を使うため、例えば以下のようにFNGパターンを変数に入れてそのまま使うとエラーになる。
$ perl -wl -e '$pattern = "Paul*.txt"; @files = <$pattern>; print @files;'ファイルハンドルとして認識されてしまう。この場合は<>内の変数名の前後をスペースで囲む。
readline() on unopened filehandle at -e line 1.
$ perl -wl -e '$pattern = "Paul*.txt"; @files = < $pattern >; print @files;'
PaulMcCartney.txt - FNGで使うメタキャラクタはシェルのワイルドカードっぽい。正規表現ではないので注意。もし正規表現を使ってより厳密・正確にしたい場合は、前にやったgrepでコードブロック内にマッチ演算子を指定するやつと組み合わせる。
$ perl -wl -e '@files=<*Paul*>; print @files;'ファイルグロブでざっくり選んだやつをgrepのフィルタでより厳密にって感じ。
JohnPaulJones.txtPaulMcCartney.txt
$ perl -wl -e '$,="\n";@files=grep{/^Paul/}<*Paul*>; print @files;'
PaulMcCartney.txt - ファイルを管理するようなUNIXコマンドと同じような関数も用意されている。(chdir、mkdir、rmdir、umask、chmod、chown、などなど)
- PerlのchownはUID/GID両方を変更できるので、chgrpは存在しない。
- chmod、chown、unkinkなどは、成功・失敗を返すのではなく、成功したファイル「数」を返すので注意!
- 組み込み関数全般で、引数の扱いには注意!
- 括弧なしでも使えるけど、括弧は指定したほうがトラブルが少なくてすむケースもある。
- 以下のようなパターンだと引数がどの関数に対して渡されるべきなのかをPerlが判断できない。
$ perl -wl -e '@files=<*Paul*>; print sort @files, "\n";'
JohnPaulJones.txtPaulMcCartney.txt
改行が@filesの各要素と並列でsortが実行されてしまっている。ただしくは以下。セパレータも使って指定した方がすっきりします。
perl -l -e '$,="\n";@files=<*Paul*>; print sort (@files);'
JohnPaulJones.txt
PaulMcCartney.txt
さて、組み込み関数もこの辺で。次からはいよいよスクリプトを作成していきます。







コメント&トラックバック
トラックバックURL: