Filtrar la Propia Salida con -| y |-

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
Licencia de Creative Commons
Programación Distribuida y Mejora del Rendimiento
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=44.
2012-06-19