2011-05-17 18 views
5

que tengo código de fiesta cortoutilizando comandos de bash en Perl

cat example.txt | grep mail | awk -F, '{print $1}' | awk -F= '{print $2}' 

quiero usar de él en escritura del Perl, y poner su salida a una línea de una matriz mediante una línea. He intentado esto, pero no funcionó

@array = system('cat /path/example.txt | grep mail | awk -F, {print $1} | awk -F= {print $2}'); 

Gracias por ayudar ...

+0

[Esta pregunta] (http://stackoverflow.com/questions/797127/whats-the-differences-between-system-and-backticks-and-pipes-in-perl) da algunos ejemplos de cómo llamar programas externos en Perl. –

Respuesta

8

Probar:

@array = `cat /path/example.txt | grep mail | awk -F, {print \$1} | awk -F= {print \$2}')`; 

Observando que acentos abiertos se utilizan y que los signos de dólar necesitan ser escapado como el operador qx se interpolar por defecto (es decir, que se piensa que $ 1 son variables de Perl en lugar de argumentos a awk)

+0

eso es :) muchas gracias – ibrahim

+1

Es más seguro usar open(); Ahorra un poco de escapar. –

+4

sin mencionar ejecutar 'awk' en perl es una blasfemia. –

11

El valor de retorno de system() es el estado de retorno del comando que ejecutó. Si desea que la salida, utilice acentos abiertos:

@array = `cat /path/example.txt | grep mail | awk -F, {print \$1} | awk -F= {print \$2}`; 

Cuando evaluada en el contexto de lista (por ejemplo, cuando se asigna el valor de retorno a una matriz), obtendrá las líneas de salida (o una lista vacía si no hay salida).

+1

¡Es un pirata arrrrrrray! – Konerak

+0

no dude en corregir 'array', una respuesta correcta vale más que una divertida. Eliminaré los comentarios tontos;) – Konerak

+0

Lo hice pero esta vez awk no funciona, solo muestra la salida de 'cat /path/example.txt | grep mail ', ¿qué debo hacer? – ibrahim

2

No pude evitar hacer una versión de Perl puro ... debería funcionar igual, si mal no recuerdo mi torpeza.

use strict; 
use warnings; 

open A, '<', '/path/example.txt' or die $!; 
my @array = map { (split(/=/,(split(/,/,$_))[0]))[1] . "\n" } (grep /mail/, <A>); 
Cuestiones relacionadas