OrePANを弄っているときに、任意のスコープで一時的にchdirして作業後、スコープ外れれば自動で元のディレクトリに戻るモジュールあれば欲しいなと思ったので書いてみた。

use Cwd::Guard;
use File::Temp;
use Path::Class;

my $tmpdir = Path::Class::dir(File::Temp::tempdir());
my $pkgdir;
{
    my $guard = cwd_guard($tmpdir);
    # chdir to $tmpdir

    my($root, @others) = `tar ztf $tarfile`
        or die "Bad archive $tarfile";
    chomp $root;
    $root =~ s{^(.+?)/.*$}{$1};
    system "tar", "zxf", "$tarfile";
    die "Bad archive: $tarfile" if ! -d $root;
    $pkgdir = $tempdir->subdir($root);
}
# back to cwd

my $meta = $pkgdir->file('META.yml')->slurp;

上は、CPANのpkg.tar.gzのファイルをtmpdirで開いてそのpkg内のMETA.ymlを開くようなサンプル。cwd_guardで作業ディレクトリに一時的に移動し、tarの解凍が終わったら、元のディレクトリに戻る感じ。実際OrePANでやってます。

CPANには、既にFile::chdirとFile::pushdっていうほぼ同じ機能をもっているモジュールがあるんだけど、Cwd::Guardのほうが検索しやすいし、実装がシンプルなので(とgfxが言ってた)リリースしました。

このブログ記事について

このページは、Masahiro Naganoが2011年2月 2日 14:58に書いたブログ記事です。

ひとつ前のブログ記事は「HTTPコンテンツ圧縮はどのレイヤーで行うのがいいか」です。

次のブログ記事は「Plack::Builder::Conditionals をリリースしました」です。

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

ウェブページ

OpenID対応しています OpenIDについて
Powered by Movable Type 4.27-ja