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が言ってた)リリースしました。