Question

Mon code ne passera pas à la dernière ligne juste avant " exit; " et je ne sais pas pourquoi. J'ai essayé de mettre une ligne supplémentaire printf $ fh avant exit , mais cela n'a pas fonctionné non plus; il n'imprimerait aucune des deux lignes. Tout le reste s’imprime bien sauf les dernières instructions avant la sortie.

Avez-vous une idée du pourquoi? Ou mieux encore, comment résoudre ce problème?

    if($i>0 && $i<3)
    {
        printf $fh "Partial match found.\n";
        if($matched_uid){printf $fh "UID #: ".$arguid." exists.\n";}
        if($matched_id){printf $fh "ID #: ".$argid." exists.\n";}
        if($matched_uname){printf $fh "Username: ".$arguname." exists.\n";}
        printf $fh "Aborting."; 
        exit;
    }

EDIT:
Une partie du code que j'ai copié contenait ce

select $fh; $| = 1; #set auto flush

C’est peut-être pour cette raison que mes résultats ne peuvent pas être dupliqués ....

Était-ce utile?

La solution

Essayez "Abandonner. \ n".

Cela ressemble à un problème de mise en mémoire tampon.

Autres conseils

J'ai donné R. Bemrose mon vote, mais si $ fh est un POIGNEE DE FICHIER , vous pouvez également souhaiter le fermer avant de le terminer.

De plus, vous utilisez mal printf . printf n'est pas «fichier d'impression». son 'format d'impression'.

Pour ce dernier exemple

  print $fh 'Message' ;  

Est tout ce dont vous avez besoin.

printf est destiné à être utilisé ainsi:

printf $fh 'some format %s  and more %s ' ,  $var , $var ; 

ou

   printf 'some format %s  and more %s ' ,  $var , $var ; 

et son équivalent à faire

   print $fh sprintf 'format %s more %s' , $var , $var ; 

Et pour cette raison, vous introduisez des risques de code inutiles dans le cas où l'une de vos variables concaténées se développe pour contenir '%'. Pour un exemple de personne tombant dans ce piège, voir Q : 308417: Pourquoi mon script Perl supprime-t-il les caractères du fichier?

perldoc -f print

print FILEHANDLE LIST
print LIST
print   Prints a string or a list of strings.

perldoc -f printf

printf FILEHANDLE FORMAT, LIST
printf FORMAT, LIST
      Equivalent to "print FILEHANDLE sprintf(FORMAT, LIST)", except that "$\" 
      (the output record separator) is not appended

Recherche ultérieure

J'ai approfondi votre problème car je ne peux pas obtenir votre "mise en mémoire tampon". condition à se produire. Tous mes fichiers sont correctement vidés, que je les vide ou non. (Perl 5.10).

Voici l'extrait de code que j'essaie:

#!/usr/bin/perl 

use strict;
use warnings;


open my $fh , '>' , '/tmp/oo.txt'; 

my $exit_at = int(rand( 200_000 ));
print "$exit_at\n";
sleep 2;
for ( 0 .. ( $exit_at * 2 ) ){ 
    print $fh 

J'ai donné R. Bemrose mon vote, mais si $ fh est un POIGNEE DE FICHIER , vous pouvez également souhaiter le fermer avant de le terminer.

De plus, vous utilisez mal printf . printf n'est pas «fichier d'impression». son 'format d'impression'.

Pour ce dernier exemple

  print $fh 'Message' ;  

Est tout ce dont vous avez besoin.

printf est destiné à être utilisé ainsi:

printf $fh 'some format %s  and more %s ' ,  $var , $var ; 

ou

   printf 'some format %s  and more %s ' ,  $var , $var ; 

et son équivalent à faire

   print $fh sprintf 'format %s more %s' , $var , $var ; 

Et pour cette raison, vous introduisez des risques de code inutiles dans le cas où l'une de vos variables concaténées se développe pour contenir '%'. Pour un exemple de personne tombant dans ce piège, voir Q : 308417: Pourquoi mon script Perl supprime-t-il les caractères du fichier?

perldoc -f print

print FILEHANDLE LIST
print LIST
print   Prints a string or a list of strings.

perldoc -f printf

printf FILEHANDLE FORMAT, LIST
printf FORMAT, LIST
      Equivalent to "print FILEHANDLE sprintf(FORMAT, LIST)", except that "$\" 
      (the output record separator) is not appended

Recherche ultérieure

J'ai approfondi votre problème car je ne peux pas obtenir votre "mise en mémoire tampon". condition à se produire. Tous mes fichiers sont correctement vidés, que je les vide ou non. (Perl 5.10).

Voici l'extrait de code que j'essaie:

Modification of a read-only value attempted at iotest.pl line 15.

J'utilise votre mauvaise utilisation de printf. La ligne commentée éjecte un message d'erreur, car elle n'est pas valide car personne ne fournit le paramètre 'n' et elle meurt avec:

<*>

Avant d'exécuter la "dernière ligne", imprimez (également mauvais, mais il n'y a pas de symbole% dedans, donc c'est bien) rendant "dernière ligne" absente du fichier de sortie.

Veuillez réparer votre printf et utilisez plutôt plain-old-print pour voir si cela résout votre problème.

; if (

J'ai donné R. Bemrose mon vote, mais si $ fh est un POIGNEE DE FICHIER , vous pouvez également souhaiter le fermer avant de le terminer.

De plus, vous utilisez mal printf . printf n'est pas «fichier d'impression». son 'format d'impression'.

Pour ce dernier exemple

  print $fh 'Message' ;  

Est tout ce dont vous avez besoin.

printf est destiné à être utilisé ainsi:

printf $fh 'some format %s  and more %s ' ,  $var , $var ; 

ou

   printf 'some format %s  and more %s ' ,  $var , $var ; 

et son équivalent à faire

   print $fh sprintf 'format %s more %s' , $var , $var ; 

Et pour cette raison, vous introduisez des risques de code inutiles dans le cas où l'une de vos variables concaténées se développe pour contenir '%'. Pour un exemple de personne tombant dans ce piège, voir Q : 308417: Pourquoi mon script Perl supprime-t-il les caractères du fichier?

perldoc -f print

print FILEHANDLE LIST
print LIST
print   Prints a string or a list of strings.

perldoc -f printf

printf FILEHANDLE FORMAT, LIST
printf FORMAT, LIST
      Equivalent to "print FILEHANDLE sprintf(FORMAT, LIST)", except that "$\" 
      (the output record separator) is not appended

Recherche ultérieure

J'ai approfondi votre problème car je ne peux pas obtenir votre "mise en mémoire tampon". condition à se produire. Tous mes fichiers sont correctement vidés, que je les vide ou non. (Perl 5.10).

Voici l'extrait de code que j'essaie:

<*>

J'utilise votre mauvaise utilisation de printf. La ligne commentée éjecte un message d'erreur, car elle n'est pas valide car personne ne fournit le paramètre 'n' et elle meurt avec:

<*>

Avant d'exécuter la "dernière ligne", imprimez (également mauvais, mais il n'y a pas de symbole% dedans, donc c'est bien) rendant "dernière ligne" absente du fichier de sortie.

Veuillez réparer votre printf et utilisez plutôt plain-old-print pour voir si cela résout votre problème.

== $exit_at ){ printf $fh '%n' ; # Bad Code Causes Early Death. printf $fh 'last line'; exit; } if (

J'ai donné R. Bemrose mon vote, mais si $ fh est un POIGNEE DE FICHIER , vous pouvez également souhaiter le fermer avant de le terminer.

De plus, vous utilisez mal printf . printf n'est pas «fichier d'impression». son 'format d'impression'.

Pour ce dernier exemple

  print $fh 'Message' ;  

Est tout ce dont vous avez besoin.

printf est destiné à être utilisé ainsi:

printf $fh 'some format %s  and more %s ' ,  $var , $var ; 

ou

   printf 'some format %s  and more %s ' ,  $var , $var ; 

et son équivalent à faire

   print $fh sprintf 'format %s more %s' , $var , $var ; 

Et pour cette raison, vous introduisez des risques de code inutiles dans le cas où l'une de vos variables concaténées se développe pour contenir '%'. Pour un exemple de personne tombant dans ce piège, voir Q : 308417: Pourquoi mon script Perl supprime-t-il les caractères du fichier?

perldoc -f print

print FILEHANDLE LIST
print LIST
print   Prints a string or a list of strings.

perldoc -f printf

printf FILEHANDLE FORMAT, LIST
printf FORMAT, LIST
      Equivalent to "print FILEHANDLE sprintf(FORMAT, LIST)", except that "$\" 
      (the output record separator) is not appended

Recherche ultérieure

J'ai approfondi votre problème car je ne peux pas obtenir votre "mise en mémoire tampon". condition à se produire. Tous mes fichiers sont correctement vidés, que je les vide ou non. (Perl 5.10).

Voici l'extrait de code que j'essaie:

<*>

J'utilise votre mauvaise utilisation de printf. La ligne commentée éjecte un message d'erreur, car elle n'est pas valide car personne ne fournit le paramètre 'n' et elle meurt avec:

<*>

Avant d'exécuter la "dernière ligne", imprimez (également mauvais, mais il n'y a pas de symbole% dedans, donc c'est bien) rendant "dernière ligne" absente du fichier de sortie.

Veuillez réparer votre printf et utilisez plutôt plain-old-print pour voir si cela résout votre problème.

% 1000 ){ print $fh "\n"; } }

J'utilise votre mauvaise utilisation de printf. La ligne commentée éjecte un message d'erreur, car elle n'est pas valide car personne ne fournit le paramètre 'n' et elle meurt avec:

<*>

Avant d'exécuter la "dernière ligne", imprimez (également mauvais, mais il n'y a pas de symbole% dedans, donc c'est bien) rendant "dernière ligne" absente du fichier de sortie.

Veuillez réparer votre printf et utilisez plutôt plain-old-print pour voir si cela résout votre problème.

Perl met sa sortie en mémoire tampon. Vous pouvez désactiver le tampon automatique avec

local $| = 1;

Edit: je frappe en quelque sorte! au lieu de | la première fois ... fixe. Aucune idée de comment cela est arrivé, ils sont sur les côtés opposés du clavier.

En ce qui concerne l'utilisation correcte de print , vous rendez les choses un peu difficiles pour vous-même.

Interpolez vos variables au lieu de concaténer les chaînes. Utilisez une instruction print avec une liste de chaînes à imprimer, au lieu de plusieurs chaînes.

Voici un moyen:

if( $i>0 && $i<3 )
{
    print $fh join "\n", 
        "Partial match found.",
        $matched_uid   ? "UID #: $arguid exists."      : (),
        $matched_id    ? "ID #: $argid exists."        : (),
        $matched_uname ? "Username: $arguname exists." : (),
        "Aborting.",
        ;

    exit;
}

Le () situé sur le côté faux de l'opérateur ternaire est une liste vide, qui disparaîtra lorsque les arguments à joindre seront aplatis. Si j'avais utilisé une chaîne vide ( '' ), chaque critère de non-correspondance aurait généré une ligne vierge supplémentaire dans les résultats.

Vous pouvez également ajouter votre propre nouvelle ligne sur chaque élément, puis ignorer la jointure, si cela vous semble plus lisible:

    print $fh  
        "Partial match found.\n",
        $matched_uid   ? "UID #: $arguid exists.\n" : '',
        ...

Vous devez ajouter un \ n final au dernier printf. Sinon, la sortie ne sera pas envoyée à la console.

Soit David Norman a raison, soit le problème est ailleurs. Je viens de taper le code à l'intérieur du bloc if dans l'interpréteur perl, et le message "Aborting" a été imprimé. comme prévu. (Cela a fonctionné pour moi même sans le caractère de nouvelle ligne qui se termine.)

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