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: abgda
Casiano Rodríguez León