camel

食後のデザートとして手頃なサイズの問題だったので。

#!/usr/local/bin/perl
#
# $Id: lwp-callback-example.pl,v 0.1 2008/11/20 15:16:48 dankogai Exp dankogai $
#
use strict;
use warnings;
use LWP::UserAgent;
use File::Basename;

my $uri      = shift || die "$0 http://example.com/big.iso [filename]";
my $filename = shift || basename($uri);
open my $wfh, '>', $filename or die "$filename:$!";
my $res = LWP::UserAgent->new->get(
    $uri,
    ':content_cb' => sub {
        my ( $chunk, $res, $proto ) = @_;
        print $wfh $chunk;
        my $size = tell $wfh;
        if (my $total = $res->header('Content-Length')){
            printf "%d/%d (%f%%)\r", $size, $total, $size/$total*100;
        }else{
            printf "%d/Unknown bytes\r", $size;
        }
    }
);
close $wfh;
print "\n", $res->status_line, "\n";
unlink $filename unless $res->is_success;

id:cho45の例よりちょっとだけ使いやすくしてみました(i.e. URIをコマンドラインから取るなど)。

Enjoy!

Dan the Perl Monger