Bienvenido a los foros de Perl en Español, Susana.
Este problema es muy sencillo. Se puede resolver siguiendo tus pasos:
Using perl Syntax Highlighting
#!/usr/bin/env perl
use v5.18;
my $IP = shift // '10.113.125.8'; # Leemos la IP desde la entrada estándar
$IP =~ s/^\d+//; # 1- Quitar el primer octeto -> 113.125.8
$IP =~ s/(\d+)/sprintf "%03d", $1/ge; # 2- Rellenar con 0 los octetos con menos de 3 dígitos -> 113.125.008
$IP =~ s/[.]//g; # 3- Quitar los puntos
$IP = 999_999_999 - $IP; # 4- Restar de 9 cada dígito -> 999.999.999 - 113.125.005 = 886.874.991
$IP = reverse $IP; # 5- y darle la vuelta
say $IP; # 199478688
Coloreado en 0.003 segundos, usando
GeSHi 1.0.8.4
Usamos expresiones regulares para quitar el primer octeto , rellenar con ceros, y quitar los puntos.
Hay más formas para resolverlo, desde luego. Por ejemplo, cambiando un poco el orden de ejecución de las operaciones:
Using perl Syntax Highlighting
#!/usr/bin/env perl
use v5.18;
my $IP = shift // '10.113.125.8'; # leemos la IP desde la entrada
my @IP = split /[.]/, $IP; # partimos la IP
@IP = map { 999 - $_ } @IP; # restamos 999 - octeto
shift @IP; # quitamos primer octeto
$IP = join '', @IP; # unir
$IP = reverse $IP; # dar la vuelta
say $IP;
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Usamos split() para sacar los octetos de forma individual, y luego operamos en cada uno de ellos.
La línea del map{} la podemos cambiar por esta otra, pero es un poco más mágica:
Using perl Syntax Highlighting
$_ = 999 - $_ for @IP;
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Podemos incluso unir todas las operaciones en una sola línea:
Using perl Syntax Highlighting
#!/usr/bin/env perl
use v5.18;
say scalar reverse join '', map { 999 - $_ } (split /[.]/, shift)[1..3];
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Unos pequeños cambios, y ya podemos ejecutarlo desde la propia línea de comandos:
Using bash Syntax Highlighting
> perl -E 'say scalar reverse join "", map { 999 - $_ } (split /[.]/, shift)[1..3]' 10.96.3.8
199699309Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Otras versiones:
Using bash Syntax Highlighting
> perl -E 'say scalar reverse 999999999 - join "", map { substr "00$_", -3 } (split /[.]/, shift)[1..3]' 10.113.125.8
199478688
> perl -E 'say scalar reverse "9"x9 - sprintf "%03d"x3, (split /[.]/, shift)[1..3]' 10.113.125.8
199478688Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
En Perl 6 se puede hacer de esta manera:
Using bash Syntax Highlighting
> perl6
-e '.split(".").[1..3].map({999-$_}).join("").flip.say for @*ARGS' 10.113.125.8 10.96.3.8
199478688
199699309Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4