idがsigned long longだった。なんとか復元したけどこれでいいのかどうなのか。sizeはlong longまで絶対に行かないのでこれは放置してもかまわない。あと、unpackのときにQが使えなかった。

#!/usr/bin/perl

use strict;
use warnings;

use Net::Amazon::S3;
use bigint;

my $s3 = Net::Amazon::S3->new(
    {   
        aws_access_key_id => $ENV{AWS_ACCESS_KEY_ID},
        aws_secret_access_key => $ENV{AWS_SECRET_ACCESS_KEY},
        retry => 1,
    }
);
my $bucket = $s3->bucket('lopnor-test');

my $res = $bucket->list_all;
use Data::Dumper;
warn Dumper $res->{keys};
for my $key (@{$res->{keys}}) {
    warn $key->{key};
    if ($key->{size} < 1000) {
        my $res = $bucket->get_key($key->{key});
        my ($file,$length) = unpack('b N', $res->{value});
        warn $file ? 'FILE' : 'DIRECTORY';
        $file or next;
        warn uri_escape $res->{value};
        for (1 .. $length) {
            my $skip = 5 + ($_ - 1)*16;
            my ($id_u,$id_l,$size_u,$size_l) = unpack("x$skip NNNN", $res->{value});
            my $id = ($id_u >= 2 ** 31 ? $id_u - 2 ** 32 : $id_u) * 2 ** 32 + $id_l;
            warn $id;
            my $size = $size_u * 2**32 + $size_l;
            warn $size;
        }
    }
}