sub id2path {
my $id = shift;
return q() unless $id;
my $path;
if ($id > 999_999) {
$path = sprintf '%03d/%03d/%03d', $id / 1_000_000,
($id / 1_000) % 1_000,
$id % 1_000;
} else {
$path = sprintf '%02d/%02d/%02d', $id / 10_000,
($id / 100) % 100,
$id % 100;
}
return $path;
}
####
sub id2path_new {
my $id = shift or return q();
my $chunk_length = length $id > 6 ? 3 : 2;
$id = sprintf '%0' . ($chunk_length * 3) . 'd', $id;
my $chunk = ".{$chunk_length}";
my $path = join '/', $id =~ / ^ (.*) ($chunk) ($chunk) $ /xg;
return $path;
}
####
use Test::More tests => 23;
is(id2path_new($_), id2path($_), "id=$_") for q(), 0, 1, 9, 10, 99,
100, 999, 1000, 9999, 10000,
99999, 100000, 999999, 1e6,
1e7-1, 1e7, 1e8-1, 1e8, 1e9,
1e10, 1e11, 1e12;