Una expresion regular en PERL....¡¡No la entiendo

Iniciado por jcjuank, 19 Julio 2005, 19:12 PM

0 Miembros y 1 Visitante están viendo este tema.

jcjuank

Buen dia. Estoy tratando de traducir un archivo en formato ebcdic a ascii hay un paquete en perl para hacerlo pero las tablas de traduccion q' usan no me sirven. Ya consegui la tabla pero tengo problemas para interpretar la siguiente expresion: eval '$byte=~tr/' . $default . '/\000-\377/'; en $default hay algo como esto $default='\000\001\002\003\234\011....se extiende hasta 255 posiciones. En $byte hay una cadena EBCDIC, empezando no se q' sea /\000-\377/ y no se como haga tr/// para hacer coincidir un caracter en $byte con / . $default . / y reemplasarlo por /\000-\377/.
Intente cambiar un valor de los q' estan en $default pero me cambia todas las cadenas q' convierta. No me deberia cambiar solo una??? Bueno ese es mi problema les agradezco cualquier ayuda.

Ivanchuk

Deberias ver la documentacion de perl, que por cierto esta muy bien documentado.

man perlintro

La descripción de los operadores esta en perlop.
El operador tr es para traducir. tr/ListaDeBusqueda/ListaDeReemplazo/
Le tenes que pasar una lista para que busque y luego otra lista con sus correspondientes reemplazos. Por ej:

my $algo="1234";
$algo=~tr/1234/Hola/;
print $algo;

De esta manera busca en $algo y reemplaza los 1 por H, 2 por o, 3 por l y 4 por a. El ejemplo imprimira "Hola". Sino le especificas una variable por medio del operador =~ trabaja sobre la variable por defecto $_.
La lista se la podes pasar como un rango tambien por medio del caracter "-"(sin las comillas), ej.:

my $algo="MAYUSCULA";
#ahora se pasa la cadena a minusculas
$algo=~tr/A-Z/a-z/;
print $algo;

En tu ejemplo, lo que hace es armar una tabla de conversión, de modo que los códigos en EBCDIC están en $default, y su correspondencia es con \000-\377(un rango de números en octal igual a 0-255).
De todas maneras te recomiendo que leas la documentacion, esta todo re bien explicado.
Bytes.
Sólo quien practica lo absurdo puede lograr lo imposible.

Join us @ http://foro.h-sec.org

jcjuank

Gracias, leere la documentacion q' me recomendaste, no sabia q' \000 era un numero en octal, ese era uno de mis errores.....
Seguire trabajando.