2009-06-22 6 views
4

Je regarde un ancien code dans Perl, où l'auteur a écrit $| = 1 dans la première ligne.

Mais le code n'a aucune instruction d'impression, il appelle un binaire C++ en utilisant la commande system. Maintenant, j'ai lu que $| va forcer le flush après chaque impression. Cela affecte-t-il la sortie de la commande système de quelque façon que ce soit ou suis-je sûr de supprimer cette ligne.

Merci Arvind

Répondre

7

je ne crois pas. Le $ | affectera la façon dont Perl est en cours d'exécution, pas d'exécutable externe.

Vous devriez pouvoir l'enlever en toute sécurité. : Etats "Si la valeur est différente de zéro, force immédiatement un vidage et après chaque écriture ou impression sur le canal de sortie actuellement sélectionné". Je pense que la chose importante ici est le "canal de sortie actuellement sélectionné". L'application externe aura son propre canal de sortie.

5

Avec des questions comme celle-ci, il est souvent facile d'écrire un programme trivial qui montre ce que le comportement est:

#!/usr/bin/perl 

use strict; 
use warnings; 

if (@ARGV) { 
    output(); 
    exit; 
} 

print "in the first program without \$|:\n"; 
output(); 

$| = 1; 
print "in the first program with \$|:\n"; 
output(); 

print "in system with \$|\n"; 
system($^X, $0, 1) == 0 
    or die "could not run '$^X $0 1' failed\n"; 

$| = 0; 
print "in system without \$|\n"; 
system($^X, $0, 1) == 0 
    or die "could not run '$^X $0 1' failed\n"; 

sub output { 
    for my $i (1 .. 4) { 
     print $i; 
     sleep 1; 
    } 
    print "\n"; 
} 

De cela, nous pouvons voir que la mise en $| n'a aucun effet sur les programmes exécutés par system.

5

Ceci est quelque chose que vous pouvez facilement vérifier vous-même. Créez un programme où le tampon est important, comme l'impression d'une série de points. Vous devriez voir la sortie à la fois au bout de dix secondes écoulées depuis la sortie est tamponne:

 
#!perl 

foreach (1 .. 10) 
    { 
    print "."; 
    sleep 1; 
    } 

print "\n"; 

Maintenant, essayez de régler $| et appeler cela avec system:

% perl -e "$|++; system(qq|$^X test.pl|)"; 

Pour mon cas de test, le $ | valeur n'a pas affecté la mise en mémoire tampon dans le processus enfant.

Questions connexes