I ♥ WordPress

[時間割:Perl]『ミニマルPerl』その21
2009/03/09 23:00 posted by kunkichi

1週間って早いなぁ、先週の更新から既に一週間、またがんばらないと、汗

ということで月曜日は「Perl」。引き続き組み込み関数編。ファイルのグロブから。

ミニマルPerl Unix/LinuxユーザのためのPerl習得法
Tim Maher
オライリージャパン
売り上げランキング: 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;'
    JohnPaulJones.txtPaulMcCartney.txt
    $ perl -wl -e '$,="\n";@files=grep{/^Paul/}<*Paul*>; print @files;'
    PaulMcCartney.txt
    ファイルグロブでざっくり選んだやつをgrepのフィルタでより厳密にって感じ。
  • ファイルを管理するような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





このページの先頭へ