Adott egy perl kód, aminek többek közt annyi a dolga, hogy "elkészíti" egy rakás különböző parancs argumentumát, majd végrehajtja őket.
A végrehajtandó parancsok különböző visszatérési értékeit és kimeneteit kell kezelni (exit code, stdout, stderr), köztük van olyan parancs, ami mindig nullával jön vissza, ott az stderr-t kell figyelni, hogy mit ír ki. Tehát fincsi.
Az alábbi kóddal oldom most meg, de nem mondanám, hogy el vagyok tőle ájulva. Jobb megoldást viszont perlben nem találtam.
Úgy rémlik, Pythonban van erre builtin, akinek azzal van tapasztalata, megoszthatná, mert lehet, hogy átírom az egészet perlről pythonba inkább.
Köpködjétek meg lécci, hátha valaki tud jobbat:
$cmd_exit = system( "@cmd 1>$self->{file_stdout} 2>$self->{file_stderr}" ) ;
# Csodálatos, nem? Itt: ^ ...és itt: ^
# Standard OUT visszaolvasása
open (CMDOUT, "<", $self->{file_stdout}) ;
while (<CMDOUT>) {
chomp $_ ;
push @stdout, $_ ;
}
close CMDOUT ;
# Ugyanez a standard ERROR-ra, a @stderr tömbbe:
# ...
push @stderr, $_ ;
# ...
return $cmd_exit, \@stdout, \@stderr ;
Betoltam pastebinbe, hogy legyen szép színe.
- 1047 megtekintés
Hozzászólások
Pedig szerintem ez a módja Perl-ben. A qx -et tudnád még használni, ha csak a STDOUT vagy csak a STDERR vagy a kettő egybe kéne, de hogy a kettő szeparáltan kell, így nem nagyon látok más megoldást.
Csaba
- A hozzászóláshoz be kell jelentkezni
Amit nem írtam, hogy előtte a fájlokat tesztelem azért, amibe írok, meg kiürítem minden ilyen system előtte, de azért ez érzésem szerint elég gány. :)
--
2e845cb4c3a5b5bd6508455b1739a8a2
- A hozzászóláshoz be kell jelentkezni
Részletkérdeés ugyan, de én a fájlbeolvasást így szeretem:
open (CMDOUT,$self->{file_stdout}) or die "hibaüzi\n" ;
my @stdout= < CMDOUT >; # az = utan nem kellenek a space-k
close CMDOUT;
chomp @stdout;
- A hozzászóláshoz be kell jelentkezni
> die
Azért nem die-oltatom el a szkriptet, mert nem tud visszaolvasni egy kimenetet. A lényeg, hogy a parancs lefusson. De még lesz ez finomítva, valószínű előtte tesztelem, hogy a fájlok írhatók-e, aztán hadd szóljon. Majd trace-elem, hogy mi történik ha olyan filehandle-el dolgozok, amit nem sikerült megnyitni. Mivel csak olvasásról van szó, gondolom nem sok minden.
> my @stdout= < CMDOUT >
Haha, nekem is lenyelte fentebb. Ez se rossz megoldás, de amit én írtam az a standard perlben, és van egy tippem is, hogy miért.
Vagy postfix-szel: push @stdout, $_ foreach (< CMDOUT >) ; chomp @stdout ;
> chomp @stdout;
Ez jó! Gyanítom jóval gyorsabb is.
--
2e845cb4c3a5b5bd6508455b1739a8a2
- A hozzászóláshoz be kell jelentkezni
IPC::Open3 lesz a baratod
- A hozzászóláshoz be kell jelentkezni
Köszi, ez jól néz ki, szerencsére Core modul.
--
2e845cb4c3a5b5bd6508455b1739a8a2
- A hozzászóláshoz be kell jelentkezni
Ötlet még jöhet, aztán nekiállok kísérletezni, melyik a legmegfelelőbb nekem. A témában érdemes elolvasni ezt a pár sort.
--
2e845cb4c3a5b5bd6508455b1739a8a2
- A hozzászóláshoz be kell jelentkezni