久しぶりにPerlのコードを書いた

| | コメント(0) | トラックバック(1) 久しぶりにPerlのコードを書いた

スクリプトのutf8化計画に役立つであろうコードを書いた。
スクリプトのあるディレクトリ以下のファイルを走査して、ファイルの文字コードをeuc-jpからutf8に変換するスクリプトだ。

それにしても、作るのに妙に時間がかかった。
徐々に勘を取り戻せればいいのだけど…。

で、色々と調べながら書いていたら、面白いモジュールを色々と見つけた。


Fatal が、渡されたサブルーチン(上の例だと open と close) をくるんで、自動で or die してくれます。open や close がだいぶすっきりしました。あとついでに先ほどの例に対してファイルハンドルを変数にしたり open を3引数にと今風に変更してみてあります。

まずはFatal。使いどころは結構あると思う。
ついでに、今までファイルを扱うときは、FileHandleを使っていたのだが、「今風」にしてみた。


File::Findの使いやすいインターフェィス

次はFile::Find::Rule。標準モジュールではないのが残念だけど。
File::Findをうまく使えればいいんだけど、いまいち使い方がよくわからない。
ファイル一覧を作って、それを順番に処理する、という感覚なので、File::Findの&wantedの考え方がいまいちしっくりこない。


perl5.8 では文字コード自動判別も用意されており,Encode::Guess がそれです.

あとは、Encode関係で、Encode::Guess。文字コードの推測です。
guess_encodingという関数が自動的にインポートされるようです。
それ以外に、Encode::Guess->guessとする方法もあるようですが、メンテナーは404 Blog Not Found:ruby|perl - 文字コードのちょっと高度な判定でguess_encodingを使っていました。

Encodeは、安定性重視から速度重視まで、色々なメソッドが用意されているようなので、404 Blog Not Found:perl tips - Encodeを速く使う方法も参考にしようと思っています。

#!/usr/bin/perl
use strict;
use warnings;
use Fatal qw/open close/;
use Encode;
use Encode::Guess qw/euc-jp shiftjis 7bit-jis/;
 
use File::Find::Rule;
 
my $rule =  File::Find::Rule->new;
$rule->file;
$rule->name( '*.cgi', '*.pm' );
my @files = $rule->in( '.' );
 
foreach my $file (@files) {
    print $file . "\n";
    euc2utf8($file);
}
 
sub euc2utf8 {
    my $filename = shift;
    if (-f $filename) {
        my $fh;
        open $fh, "<", $filename;
        my $doc;
        {
            local $/ = undef;
            $doc = <$fh>;
        }
        close $fh;
 
        my $enc = guess_encoding($doc);
        ref($enc) or die "Can't guess: $enc";
 
        open $fh, ">", $filename . ".utf8";
        Encode::from_to($doc, $enc, "utf8");
        print $fh $doc;
        close $fh;
    }
}

トラックバック(1)

このブログ記事に対するトラックバックURL:

このブログ記事を参照しているブログ一覧:

Perlでもなんでも、ソースをブログに載せるときは気をつけたいもの。 ファイルを... 続きを読む

コメントする

Google検索

Last.fm

このブログ記事について

このページは、のぶりんが2008年11月17日 00:27に書いたブログ記事です。

ひとつ前のブログ記事は「iTunes8の新機能「Genius」を使ってみた」です。

次のブログ記事は「Perlの超軽量フレームワーク「MENTA」を追っかける」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ウェブページ

Creative Commons License
このブログのライセンスは クリエイティブ・コモンズライセンス.
Powered by Movable Type 4.23-ja