2008年12月01日

Perlをさわり始める。(File::Find)

2年前の今頃このサイトでもちょっとだけPerlをやったかもしれないけれど

それはレンサバ用という趣旨でローカルも含めてPHPに目が向いていたのだが
使いやすさと柔軟性でCやFlashと併用して使うものとしてPerlを使うことにした。
朝の写真アップ作業の自動化に合わせてとりあえず必要な部分からやっていくことにした。

今回は「File::Find」を使ったファイル名の取得について
ほんとはshとコマンドプログラムだけで頑張ると言う手もあるのだが
そこそこの実用性をもっているPerlなら機種依存少ないものができる。
アルゴリズムとプログラムということでCへの変換などの最適化も含めて
本筋から脱線しない程度にやってみたい。

元々は一枚一枚手で編集していたものをWindows版のirfunviewで一括変換していたのだが
フォルダー内のデータを全部連番をつけて変換すると言う作業はむしろUNIX的方法に向いているので
やろうと思った。
変換自体はImageMagickを使う。
ImageMagick自体フォルダー内の処理をまとめてすることは可能で
最初は


$pr= "convert * -sharpen 1 -resize 640x480 -quality 80 ~/wk/m1/m.jpg"

とした。
こうすることでフォルダー内を一括して変換し拡張子の手前を連番にしてくれる。

しかしどうもこの作業を全データを読み込んでから吐き出しているらしい。
shellでループかけてもいいのだがとりあえずやってみようと思った。

「File::Find」は標準ユニットだそうだ。

使い方は以下のようになる。
Perlをまじめにやるのははじめてなので基本ルールでいろいろてこずった。

Findの使い方はサブルーチンを作っておくとfind関数でコールバックするという仕組みのようだ。


#!/usr/local/bin/perl

use File::Find;
sub pics{
return if ( $_ !~ /jpg$/i );#jpg JPG
#カレントディレクトリ
print "\$File::Find::dir :".$File::Find::dir."\n";
#パラメータとして渡される変数
print "\$_ :".$_."\n";
#フルパスのファイル名
print "\$File::Find::name :".$File::Find::name."\n";
}

find(\&pics, './');

_end_



以上のような形でカレントディレクトリー以下のディレクトリーの拡張子「jpg」ないしは「JPG」のものをリストアップする。
再帰的下のディレクトリーにやりたくない場合は工夫がいるらしいが今回は考慮しない。
$File::Find::dir で「.」以外返すというのも手。


return if ($File::Find::dir ne ".");#カレントディレクトリーのみ


findの第二変数は
「カレントディレクトリー」として「./」を使ったが「.」も同等

今回学んだPerlの基本

  1. 「_end_」はなくてもいいらしい。

  2. 関数は先に宣言しなくてもいい

  3. 文字列は「.」でつなげる。

  4. サブルーチンを呼ぶときは「&」をつける。findの場合は「\」が必要

  5. サブルーチンのパラメータは配列「_」でアクセスする。

  6. 基本は正規表現

  7. 条件分岐に「/ **/」でマッチングが使える。

  8. 条件分岐に「=」はなくてもよいようだ。

  9. マッチングのiオプションで大文字小文字を区別しない。



まだ基本が分かっていないがとりあえず実用上は問題無いようだ。


ラベル:File::Find
posted by Xo_ox at 20:18| Comment(0) | perl | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。