8
votes

Lire des données non coupées de tuyaux dans Perl

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";
}


3 commentaires

Vous devriez utiliser pendant pas un foreach . 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 () {...} , 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 boucle. Dans alors que (mon $ i = ) {...} , 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.


4 Réponses :


1
votes

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);
}


1 commentaires

Réglage $ | n'affecte que la mise en mémoire tampon de sortie. 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"; ? Je ne peux jamais me souvenir "| -" vs "- |" moi-même. Quoi qu'il en soit, si le programme iOSTAT ne glisse pas ses tampons sur un tuyau, vous devez vous rendre à PTYS, ce qui est une véritable préoccupation mais inavobile.



1
votes

J'ai ci-dessous le code travaillant pour moi xxx


2 commentaires

Pourquoi pas ouvert (fichier, "iostat -dx 10 5 |") ?


@tchist parce que tuyau ouvert, '- |', 'iostat', '-dx', 10, 5 ou Die $!



5
votes
#!/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: $! $?";

0 commentaires

1
votes

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: ".

Donc xxx

qui a fonctionné dans mon cas.


0 commentaires