Question

J'ai un peu de problème comprendre ce que Perl dans le cas suivant:

while(1){
$inputLine=<STDIN>

#parse $inputLine below
#BUT FIRST, I need to check if $inputLine = EOF

}

avant que je la réponse évidente d'utiliser while(<>){}, permettez-moi de dire qu'il ya une raison très forte que je dois faire ce qui précède (réglage essentiellement en une alarme pour interrompre le blocage et je ne voulais pas que le code à encombrer l'exemple) .

Y at-il someway de comparer $inputLine == undef (comme je pense que c'est ce qui revient STDIN à la fin).

Merci.

Était-ce utile?

La solution

Dans votre boucle, utilisez

last unless defined $inputLine;

De la perlfunc documentation sur defined :

  

défini EXPR    défini

     

Retourne une valeur booléenne indiquant si EXPR a une valeur autre que la valeur définie undef . Si EXPR n'est pas présent, $_ sera vérifiée.

     

De nombreuses opérations de retour undef pour indiquer l'échec, la fin du fichier, erreur système, non initialisée variable et d'autres conditions exceptionnelles. Cette fonction vous permet de distinguer undef d'autres valeurs. (Un simple test booléen ne distinguera pas undef , zéro, la chaîne vide, et "0" , qui sont tous faux.) Notez que depuis undef est un scalaire valide, sa présence ne signifie pas nécessairement une condition exceptionnelle: pop retourne undef lorsque son argument est un tableau vide, ou lorsque l'élément de retour sera undef .

Autres conseils

defined($inputLine)

En outre, voir le rel="nofollow version 4 argument de la fonction de select pour une autre façon de lire un descripteur de fichier sans bloquer.

Vous pouvez utiliser EOF sur le descripteur de fichier. EOF retournera 1 si la prochaine lecture sur DESCRIPTEUR est une EOF.

Les éléments suivants ont des problèmes avec les fichiers d'entrée qui ont des lignes qui ont seulement un saut de ligne ou comme dans le cas qui me donne des problèmes de FF au début de certaines lignes (Form Feed - le fichier a été la sortie d'un programme développé à la fin des années 70 et a toujours mise en forme pour une imprimante en ligne et est toujours en FORTRAN - ne me manque le papier large pour dessiner des diagrammes en continu de flux à l'arrière)

.
open (SIMFIL, "<", 'InputFileName') or die "Can´t open InputFileName\n" ;
open (EXTRDATS, ">>", 'OutputFileName' ) or die "Can´t open OutputFileName\n";
$Simfilline = "";
while (<SIMFIL>) {
    $Simfilline = <SIMFIL>;
    print EXTRDATS $Simfilline;
    $Simfilline = <SIMFIL>;
    print EXTRDATS $Simfilline;
    }
close SIMFIL;
close EXTRDATS;

` Ce qui suit est quand EOF est très pratique - l'expression:. « While () » peut retourner false dans des conditions autres que la fin du fichier

open (SIMFIL, "<", 'InputFileName') or die "Can´t open InputFileName\n" ;
open (EXTRDATS, ">>", 'OutputFileName' ) or die "Can´t open OutputFileName\n";
$Simfilline = "";
while (!eof SIMFIL) {
    $Simfilline = <SIMFIL>;
    print EXTRDATS $Simfilline;
    $Simfilline = <SIMFIL>;
    print EXTRDATS $Simfilline;
    }
close SIMFIL;
close EXTRDATS;

Ce dernier fragment de code semble dupliquer le fichier d'entrée exactement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top