Frage

Mein Code wird die letzte Zeile direkt vor „exit;“ nicht ausgeführt, und ich habe keine Ahnung, warum. Ich habe versucht, eine zusätzliche printf $fh Linie vor exit zu setzen, aber das hat nicht funktioniert entweder; es würde entweder Zeile nicht gedruckt. Alles andere druckt fein mit Ausnahme der letzten Druck Aussagen vor dem Ausgang.

Jede Ahnung, warum dies geschieht? Oder noch besser, wie um es zu beheben oder Arbeit?

    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:
Ein Teil des Codes I kopiert enthielt dieses

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

Vielleicht aus diesem Grunde können meine Ergebnisse nicht dupliziert werden ....

War es hilfreich?

Lösung

Versuchen "Abbrechend. \ N"

Das sieht wie ein Puffer Problem.

Andere Tipps

Ich habe R. Bemrose meine Stimme, aber wenn $ fh ein Datei-Handles ist Sie können auch close vor dem Beenden.

Auch Sie verwenden printf falsch. printf ist nicht 'Druckdatei'. sein ‚Druckformat‘.

Für dieses letzte Beispiel

  print $fh 'Message' ;  

Sie alles, was Sie brauchen.

printf soll so verwendet werden:

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

oder

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

und seine equivelant zu tun

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

Und aus diesem Grunde, sind Sie unnötigen Code setzen Risiken für den Fall in einem Ihrem verketteten Variablen erweitern in ihnen ‚%‘ haben. Ein Beispiel für die Menschen in diese Falle zu tappen, finden Sie unter Q : 308417: Warum aus der Datei Zeichen nicht mein Perl-Skript entfernen

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

Weitere Probing

Ich habe in Ihr Problem Sondierung weiter, weil ich nicht Ihre „Pufferung“ Bedingung auftreten bekommen. Alle meine Dateien werden richtig gespült, ob ich sie spülen. (Perl 5.10).

Heres mein Code-Schnipsel Ich versuche:

#!/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 $_;
    if ( $_ == $exit_at ){
        printf $fh '%n' ; # Bad Code Causes Early Death. 
        printf $fh 'last line';
        exit; 
    }
    if ( $_ % 1000  ){
        print $fh "\n";
    }
}

Ich bin mit Ihrer miss-Nutzung von printf. Die Linie, die kommentiert wird wirft eine Fehlermeldung, weil seine nicht gültig aufgrund niemand die ‚n‘ Parameter bereitstellt, und es stirbt mit:

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

Vor dem ‚letzter Zeile‘ print (auch schlecht, aber es gibt keine% Symbole in ihm so seine feinen) machen ‚letzte Zeile‘ abwesend aus der Ausgabedatei ausgeführt wird.

Bitte korrigieren Sie Ihre printf und verwenden plain-old-Druck statt und sehen, ob das Ihr Problem löst.

Perl puffert seinen Ausgang. Sie können mit deaktivieren autobuffering

local $| = 1;

Edit: Ich irgendwie schlagen! statt | das erste Mal ... fixiert. Keine Ahnung, wie das passiert ist, sie sind auf den gegenüberliegenden Seiten der Tastatur.

Zum Thema ordnungsgemäße Verwendung der print, machen Sie die Dinge ein wenig hart zu sich selbst.

Interpolation Ihre Variablen statt der Saiten zusammen verketten. Verwenden Sie eine print-Anweisung mit einer Liste von Zeichenketten zu drucken, statt mehrerer Strings.

Hier ist eine Art und Weise:

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

Die () auf der falschen Seite des ternären Operators ist eine leere Liste, die verschwindet, wenn die Argumente abgeflacht sind, zu verbinden. Wenn ich verwendet habe und leere Zeichenfolge (''), die jeweils nicht-Anpassungskriterium eine zusätzliche Leerzeile in den Ergebnissen geführt haben würde.

Sie können auch Ihre eigenen Newline für jedes Element hinzufügen und dann überspringen die Verbindung, wenn Sie denken, dass dies besser lesbar ist:

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

Sie benötigen einen nachgestellten \ n zur letzten printf hinzuzufügen. Andernfalls ist die Ausgabe an die Konsole nicht gespült bekommen.

So oder David Norman ist richtig, oder das Problem woanders ist. Ich tippte nur den Code innerhalb des if-Block in den Perl-Interpreter, und es gedruckt „Abbrechend.“ wie erwartet. (Es ist für mich auch ohne das abschließende Newline-Zeichen).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top