

tr/SEARCHLIST/REPLACEMENTLIST/cds |
y/SEARCHLIST/REPLACEMENTLIST/cds |
El operador permite el reemplazo carácter a carácter, por ejemplo:
$ perl -de 0 DB<1> $a = 'fiboncacci' DB<2> $a =~ tr/aeiou/AEIOU/ DB<3> print $a fIbOncAccI DB<4> $a =~ y/fbnc/FBNC/ DB<5> print $a FIBONCACCIEl operador devuelve el número de carácteres reeemplazados o suprimidos.
$cnt = $sky =~ tr/*/*/; # count the stars in $sky
Si se especifica el modificador /d, cualquier carácter en SEARCHLIST
que no figure en REPLACEMENTLIST es eliminado.
DB<6> print $a FIBONCACCI DB<7> $a =~ y/OA//d DB<8> print $a FIBNCCCI
Si se especifica el modificador /s, las secuencias de carácteres
consecutivos que serían traducidas al mismo carácter son comprimidas a una sola:
DB<1> $b = 'aaghhh!' DB<2> $b =~ tr/ah//s DB<3> p $b agh!
Observa que si la cadena REPLACEMENTLIST es vacía,
no se introduce ninguna modificación.
Si se especifica el modificador /c, se complementa SEARCHLIST;
esto es, se buscan los caracteres que no están en SEARCHLIST.
tr/a-zA-Z/ /cs; # change non-alphas to single space
Cuando se dan múltiples traducciones para un mismo carácter, solo la primera es utilizada:
tr/AAA/XYZ/
traducirá A por X.
El siguiente script busca una expresión regular en el fichero de passwords
e imprime los login de los usuarios que casan con dicha cadena.
Para evitar posibles confusiones con las vocales acentuadas
se usa el operador tr.
1 #!/usr/bin/perl -w
2 $search = shift(@ARGV) or die("you must provide a regexpr\n");
3 $search =~ y/ÁÉÍÓÚáéíóú/AEIOUaeiou/;
4 open(FILE,"/etc/passwd");
5 while ($line = <FILE>) {
6 $line =~ y/ÁÉÍÓÚáéíóú/AEIOUaeiou/;
7 if ($line =~ /$search/io) {
8 @fields = split(":",$line);
9 $login = $fields[0];
10 if ($line !~ /^#/) {
11 print "$login\n";
12 }
13 else {
14 print "#$login\n";
15 }
16 }
17 }
18
Ejecución (suponemos que el nombre del fichero anterior es split.pl):
> split.pl Rodriguez ##direccion call casiano alu5 alu6 ##doctorado paco falmeida ##ihiu07
Para familiarizarte con este operador, codifica y prueba el siguiente código:
1 #!/usr/bin/perl -w
2 $searchlist = shift @ARGV;
3 $replacelist = shift @ARGV;
4 $option = "";
5 $option = shift @ARGV if @ARGV;
6
7 while (<>) {
8 $num = eval "tr/$searchlist/$replacelist/$option";
9 die $@ if $@;
10 print "$num: $_";
11 }
Perl construye la tabla de traducción en ``tiempo de compilación''. Por ello
ni SEARCHLIST ni REPLACEMENTLIST son susceptibles de
ser interpolados. Esto significa que si queremos usar variables tenemos
que recurrir a la función eval.
La expresión pasada como parámetro a eval en la línea 8 es analizada y ejecutada como si
se tratara de un pequeño programa Perl. Cualquier asignación a variables permanece
después del eval, asi como cualquier definición de subrutina.
El código dentro de eval se trata como si fuera un bloque, de manera
que cualesquiera variables locales (declaradas con my) desaparecen
al final del bloque.
La variable $@ contiene el mensaje de error asociado con la
última ejecución del comando eval. Si es nula es que el último comando
se ejecuto correctamente.
Aqui tienes un ejemplo de llamada:
> tr.pl 'a-z' 'A-Z' s jose hernandez 13: JOSE HERNANDEZ joosee hernnandez 16: JOSE HERNANDEZ

