2011-05-17 7 views
5

mam krótki kod Bashużywając polecenia bash w Perlu

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

Chcę używać go w Perl skrypt, i umieścić swoje wyjście do linii tablicy po linii. próbowałem tego, ale nie działa

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

Dzięki za pomoc ...

+0

[Pytanie] (http://stackoverflow.com/questions/797127/whats-the-differences-between-system-and-backticks-and-pipes-in-perl) podaje kilka przykładów, w jaki sposób wywoływać programy zewnętrzne w Perlu. –

Odpowiedz

8

Spróbuj:

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

Stwierdzając, że backticks są wykorzystywane i że znaki dolara trzeba uciekł jako operator QX będzie interpolować domyślnie (czyli będzie myśleć, że $ 1 są zmienne Perl zamiast argumentów awk).

+0

thats it :) dziękuję bardzo – ibrahim

+1

Bezpieczniej jest użyć open(); Oszczędza trochę ucieczki. –

+4

nie wspominając o uruchamianiu 'awk' w perlu jest takim bluźnierstwem. –

11

Wartość zwracana system() jest zwracany z was wykonywanego polecenia. Jeśli chcesz wyjście, użyj odwrócone, pojedyncze apostrofy:

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

Kiedy oceniana w kontekście listy (np gdy wartość zwracana jest przypisany do tablicy), dostaniesz linie wyjściowe (lub pustą listę, jeśli nie ma wydajność).

+1

To piracki arrrrrray! – Konerak

+0

nie krępuj się poprawić "tablicę", poprawna odpowiedź jest warta więcej niż zabawna. Usuwam głupie komentarze;) – Konerak

+0

Zrobiłem to, ale tym razem awk nie działa, daje tylko wynik 'cat /path /example.txt | grep mail ", co powinienem zrobić? – ibrahim

2

Nie można pomóc w tworzeniu czystej wersji perla ... powinien działać tak samo, jeśli dobrze pamiętam mój bardzo mały awk.

use strict; 
use warnings; 

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