J'essaie de lire des données débordantes d'un tuyau à Perl. Par exemple dans le programme ci-dessous:
open FILE,"-|","iostat -dx 10 5"; $old=select FILE; $|=1; select $old; $|=1; foreach $i (<FILE>) { print "GOT: $i\n"; }
4 Réponses :
Si cela va bien attendre dans votre script Perl sur la commande Linux, cela devrait fonctionner. Je ne pense pas que Linux permettra de contrôler le script Perl avant que l'exécution de la commande soit terminée.
#!/usr/bin/perl -w my $j=0; while($j!=5) { open FILE,"-|","iostat -dx 10 1"; $old=select FILE; $|=1; select $old; $|=1; foreach $i (<FILE>) { print "GOT: $i"; } $j++; sleep(5); }
Réglage $ | code> n'affecte que la mise en mémoire tampon de sortie. B> Vous ne pouvez pas affecter le tampon de sortie de l'autre programme de cette manière. De plus, ce qui est avec l'étrange ouverte au lieu de
ouvert (tubehandle, "iostat -dx 10 1 |") || Die "Impossible de démarrer le tuyau"; code>? Je ne peux jamais me souvenir
"| -" code> vs
"- |" code> moi-même. Quoi qu'il en soit, si le programme
iOSTAT CODE> ne glisse pas ses tampons sur un tuyau, vous devez vous rendre à PTYS, ce qui est une véritable préoccupation mais inavobile.
J'ai ci-dessous le code travaillant pour moi
Pourquoi pas ouvert (fichier, "iostat -dx 10 5 |") code>?
@tchist parce que tuyau ouvert, '- |', 'iostat', '-dx', 10, 5 Code> ou Die $!
#!/usr/bin/env perl use strict; use warnings; open(PIPE, "iostat -dx 10 1 |") || die "couldn't start pipe: $!"; while (my $line = <PIPE>) { print "Got line number $. from pipe: $line"; } close(PIPE) || die "couldn't close pipe: $! $?";
Les solutions jusqu'à présent ne fonctionnaient pas pour moi en ce qui concerne un découpage (Windows Activestate Perl 5.10).
Selon http://perldoc.perl.org/perlio.html ," pour obtenir un flux non volé spécifier une couche non coupée (par exemple: Unix) dans l'appel ouvert: ". P>
P> P> P> Donc p> qui a fonctionné dans mon cas. P> p>
Vous devriez utiliser
pendant code> pas un
foreach code>. Et votre tampon de sortie est immatériel, étant donné qu'il s'agit d'une poignée d'entrée et non d'une poignée de sortie.
Quelle est la différence lorsque vous utilisez et foreach?
@alertjean: dans
foreach mon $ i () {...} code>, le fichier lu est effectué dans le contexte de la liste, c'est-à-dire que l'ensemble du fichier est lu avant que les lignes soient traitées dans le
foreach code> boucle. Dans
alors que (mon $ i =) {...} code>, la lecture est effectuée dans le contexte scalaire, c'est-à-dire que chaque ligne est lue puis traitée dans le bloc tandis que dans le prochain bloc. la ligne est lue.