Lun Mar 31, 2008 6:35 pm
|
 |
creating021
Vive para Perl en Español

|
Registrado: 23 Feb 2006
Mensajes: 481
Ubicación: Frente al monitor
|
|
| Ayuda para mejorar código |
|
|
¿Hay alguna forma de hacer esto más rápido y "limpio"?
| Perl: | sub Crypt {
my ( $kk, $text ) = @_;
my $i = 0;
my @return;
for ( $i; $i <= length($text); $i++ ) {
my $a = unpack( 'C', substr $text, $i, 1 );
my $b = unpack( 'C', substr $kk, $i, 1 );
push @return, ( pack( 'C', $a ^ $b ) );
}
return @return;
} |
Es un encriptador OTP (One-time pad) donde $kk y $text tienen el mismo tamaño.
¿Sería mejor hacer un módulo y usar tie de alguna manera ( como Tie::File ) para controlar el buffer de las dos escalares sin limitar el tamaño?
¿Hay alguna forma de mejorar la parte del for?
Sugerencias o aplausos son bienvenidos  |
|
|
|

Mar Abr 01, 2008 1:36 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4092
Ubicación: Valladolid, España
|
|
|
|
|
Si solo se trata de hacer una operación or-exclusivo entre dos cadenas de caracteres, no hace falta liarse tanto...
Hay que tener cuidado a la hora de usar las operaciones de bits, ya que no es lo mismo hacer las operaciones con strings que con números:
| Perl: | perl -le '$a=150;$b=105;print $a|$b' # 255, porque hace 0x96 | 0x69 = 0xFF
perl -le '$a="150";$b="105";print $a|$b' # 155, porque la operación se hace carácter a carácter
|
Leer la sección Bitwise-String-Operators.
En tu caso, si quieres hacer la operación or-exclusivo a nivel de carácter, te vale con escribir:
| Perl: | sub Crypt {
my ( $kk, $text ) = @_;
return split //, $kk ^ $text;
} |
Ejemplo
| Perl: | perl -le 'sub Cryp { my($k,$t) = @_; return split //, $k ^ $t } print Cryp("creating021"," "x5)' # CREATing021
|
|
|

Mar Abr 01, 2008 5:41 pm
|
 |
creating021
Vive para Perl en Español

|
Registrado: 23 Feb 2006
Mensajes: 481
Ubicación: Frente al monitor
|
|
|
|
|
Perfecto, y gracias por el link  |
|
Powered by phpBB © 2001, 2005 phpBB Group
|