Comment puis-je vérifier eof en Perl?
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.
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 distinguerundef
d'autres valeurs. (Un simple test booléen ne distinguera pasundef
, zéro, la chaîne vide, et"0"
, qui sont tous faux.) Notez que depuisundef
est un scalaire valide, sa présence ne signifie pas nécessairement une condition exceptionnelle:pop
retourneundef
lorsque son argument est un tableau vide, ou lorsque l'élément de retour seraundef
.
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.