[Madrid-pm] Esto tiene que existir ya en cpan...

Diego Kuperman diego en kuperman.com.ar
Dom Abr 11 06:07:44 PDT 2010


Hola!,

he estado pensando como acortar la representacion de enteros para usar
en las url's de una cosa que estoy haciendo y se me ha ocurrido que lo
que quiero es pasarlos a base 62 (caracteres válidos y que se leen bien
en una url). Esto es lo que he escrito:

my @base62 = ( 0..9, 'a'..'z', 'A'..'Z' );

my $short = rebase( 666, @base62 ); # devuelve 'aK'

sub rebase {
    my ( $int, @chars ) = @_;
    return $chars[0] if $int == 0;

    my $base = scalar @chars;
    my $ret = '';
    while( $int > 0 )
    {
        $ret = $chars[ $int % $base ] . $ret;
        $int = int( $int / $base );
    }
    return $ret;
}

sub revert_rebase {
    my ( $ret, @chars ) = @_;
    my %chars  = map { $chars[$_] => $_ } 0 .. $#chars;
    my $base   = scalar @chars;
    my $int = 0;
    for ( $ret =~ /./g ) {
        $int *= $base;
        $int += $chars{$_};
    }
    return $int;
}

----

Pero este código es generico y me permite armar arrays para usar de base
lo que yo quiera:

rebase( 666, ( 0..9, 'A'..'F' ) ); #hex

rebase( 666, ( 0, 1 ) ); #bin

rebase( 666, ('Z'..'K', 'a'..'j', 9..0, 'k'..'z', 'J'..'A' ) );

...

El tema es que estoy seguro de que ya hay algun modulo que hace esto
pero no lo encuentro :(

Alguien lo conoce?, si no fuera así, que nombre le pondriais para subirlo?

Saludos,

-dk




Más información sobre la lista de distribución Madrid-pm