#!/usr/bin/perl # # http://sourceforge.net/snippet/detail.php?type=snippet&id=101162 # Originally in PHP # # fmtbase: accept BASE and optional LENGTH, # read base-10 numbers from stdin, print # numbers in BASE with LENGTH digits. # # example: seq 1 10 | fmtbase 16 use strict; use warnings; sub base36($$$); my ($base) = shift(@ARGV) || die "usage: $0 base\n"; $base =~ m/^\d+$/ or die "base must be a number\n"; ($base >= 2 && $base <= 36) or die "base must be between 2 and 36\n"; my ($len) = shift(@ARGV) || 0; $len =~ m/^\d+$/ or die "length must be a number\n"; while (<>) { chomp; m/^\d+$/ or die "$_: must be a number\n"; print base36($_, $base, $len), "\n"; } exit(0); sub base36($$$) { use integer; my ($value, $base, $len) = @_; my (@basechars) = qw( 0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x y z ); my $remainder = 0; my $newval = ""; while ($value > 0) { $remainder = $value % $base; $value = (($value - $remainder) / $base); $newval .= $basechars[$remainder]; } no integer; $newval = reverse($newval); while ($len > length ($newval)) { $newval = '0' . $newval; } return ($newval); }