ダウンロードした tar.gzをファイルに書き出さずに展開する

諸事情で Perlを書いていてやり方がわからなかったので調べた. ローカルファイルの tar.gzを展開みたいなのはそれなりにあったけど, オンメモリのまま処理する方法が皆無だった.

#!/usr/bin/env perl
use strict;
use warnings;

use HTTP::Tiny;
use Encode;
use Archive::Tar;
use IO::Uncompress::Gunzip qw(:all);

my $dest = shift;
my $url = 'https://www.cpan.org/src/5.0/perl-5.36.0.tar.gz';

my $res = HTTP::Tiny->new->get($url);
unless ($res->{success}) {
    die "$res->{status} $res->{reason}";
}

my $tar_buf;
gunzip \$res->{content}, \$tar_buf or die "gunzip failed: $GunzipError\n"; 

open my $fh, '<', \$tar_buf or die "Can't open tar content as a file handle: $!";

my $tar = Archive::Tar->new;
$tar->read($fh);

if (defined $dest) {
    $tar->setcwd($dest);
}

$tar->extract;

close $fh;

Perl Navigator を使って書いたけど, 他言語に比べるとだいぶ貧弱だが, 幾分補完やエラーチェックも効き Emacs等で書くよりはだいぶ楽に書けた気がする. 何も補完が効かないとかさすがにもう書けなくなってしまったのでありがたい存在でした.