Uso de comillas de ejecución (Backticks)

Contexto Escalar

Cuando se quiere capturar la salida de un programa utilizaremos las comillas hacia atrás (backquotes o backticks):

1 #!/usr/local/bin/perl5.8.0 -w
2
3 my $who = shift;
4 my $options = shift;
5 my $users = `who $options`;
6
7 until ($users =~ m/$who/)
8   { $users = `who $options`; }
9
10 print $users;
Como muestra el ejemplo, la cadena entre backquotes se interpola igual que una cadena de comillas dobles.

Contexto de Lista

Si se usan las backquotes en un contexto de lista se obtiene una lista cuyos elementos son las líneas de salida el programa. Veamos un ejemplo:

#!/usr/bin/perl -w
my @user =  `cat /etc/passwd`; 
my (@name, @uid);
my $x;

for ($i=0; $i < @user; $i++) {
  ($name[$i], $x, $uid[$i]) = split ':', $user[$i];
}

@name = @name[
  sort {$uid[$a] <=> $uid[$b]} 0..$#name
];

print "@name\n";

Ejercicio 1.4.1   ¿Que ocurre en un contexto de lista en una ejecución con backticks si se ha redefinido $/?

Recolectando stderr

Es posible recoger los contenidos de stderr:

pp2@nereida:~/Lbook$ perl -wde 0
main::(-e:1):   0
  DB<1> $x = `ls /tutu 2>&1` # stdout y stderr juntos
  DB<2> p $x
ls: /tutu: No existe el fichero o el directorio
  DB<2> $y = `(echo 'Tutu'; ls /tutu) 2>&1 1>/dev/null` # Eliminar stdout
  DB<3> p $y
ls: /tutu: No existe el fichero o el directorio

qx y la Comilla Simple

Ejercicio 1.4.2   Explique la siguiente salida:
pp2@nereida:~/Lbook$ perl -wde 0
main::(-e:1):   0
  DB<1> @a = 1..5
  DB<2> p  qx(echo @a)
1 2 3 4 5
  DB<3> p  qx'echo @a'
@a
¿Que ocurre cuando el delimitador de qx es la comilla simple?. Consulte perldoc perlop.



Subsecciones
Casiano Rodríguez León
2012-02-29