Consideremos el problema de reescribir la función print
de manera que afecte
a todos los subsecuentes usos de print
. Reescribirla y ponerla en CORE::GLOBAL
no funciona. Una solución es crear un proceso hijo con
$pid = open(STDOUT, "|-") filterstdout() unless $pid;
con lo que redirigimos STDOUT
a la entrada del proceso
hijo. Este ahora actúa como un filtro de la salida.
lhp@nereida:~/Lperl/src/cookbook/ch16$ cat -n openself 1 #!/usr/local/bin/perl -w 2 use strict; 3 use utf8; 4 binmode(STDOUT, ':utf8'); 5 binmode(STDIN, ':utf8'); 6 7 print "Proceso padre: $$\n"; 8 9 my $pid = open(STDOUT, "|-"); 10 die "cannot fork: $!" unless defined $pid; 11 12 # Hijo actúa como filtro 13 filterstdout() unless $pid; 14 15 # Padre 16 print " <- Este primer número es el PID del proceso hijo\n"; 17 while (<>) { 18 print 19 } 20 21 sub filterstdout { 22 while (<STDIN>) { 23 tr/áéíóúñ€αβγδ/aeioun$abgd/; 24 print "$$: $_"; 25 } 26 exit; 27 }Al ejecutar produce una salida como la siguiente:
lhp@nereida:~/Lperl/src/cookbook/ch16$ cat -n prueba 1 áéíóú 2 ñññññ 3 €€€€€ 4 αβγδα lhp@nereida:~/Lperl/src/cookbook/ch16$ openself < prueba Proceso padre: 29468 29469: <- Este primer numero es el PID del proceso hijo 29469: aeiou 29469: nnnnn 29469: $$$$$ 29469: abgdaCasiano Rodríguez León