2009-07-03 17 views
0

OK, so ist dies so einfach, aber für das Leben von mir kann ich nicht herausfinden, warum Sie den Code unten funktioniert nicht.Perl - Warum funktioniert diese einfache Datei nicht?

Ich versuche einfach ein CGI-Skript zu schreiben, die fortlaufend nummerierte Dateien erstellt. Ich verwende einen Zähler (in einer separaten Datei gespeichert) Spur der letzten Ordnungs Wert zu halten, und dann einen eindeutigen Dateinamen zu erzeugen mit sprintf. Die eindeutig benannte Datei wird NICHT erstellt. Ich vermute, es ist ein Problem mit sprintf(...) nicht korrekt $ Ordnungs auf einen Skalar Umwandlung?

Wenn ich $ordinal von etwa zuweisen Ersetzen der Linie $ordinal = <NUMPHOTOS>; mit $ordinal=42; der Code funktioniert und eine Datei mit dem Namen 00000042.jpg erstellt wird.

Was mache ich hier falsch?

Hilfe!

my ($filename, $ordinal); 

local $| = 1; 
print "Content-type: text/plain\n\n"; 

# NOTE: $ordinal is set to zero if the file doesn't exist 
open (NUMPHOTOS, "<numpics.dat"); 
$ordinal = <NUMPHOTOS>; 
print "ordinal = $ordinal"; 
$filename = sprintf("%08d.jpg", $ordinal); 
close (NUMPHOTOS); 

open (NUMPHOTOS, ">numpics.dat"); 
$ordinal += 1; 
print NUMPHOTOS $ordinal; 
close (NUMPHOTOS); 

open (UPLOADFILE, ">$filename") or die "ERROR: can't open $filename: $! \n"; 
print "writing out file $filename...\n"; 
print UPLOADFILE 'hello world'; 
close UPLOADFILE; 
+1

Insert print „Opening $ Dateiname \ n“ stellen wollen; vor dem Öffnen (UPLOADFILE ...) Befehl, um den $ filename zu überprüfen. –

+0

Siehe http://perldoc.perl.org/perlfaq5.html#I-still-don%27t-get-locking.--I-just-want-to-increment-the-number-in-the-file. --How-can-I-do-this% 3f –

Antwort

1

Perl haben kein Problem sprintf() eine String-Nummer --- es nicht stark typisiert wird.

Sie unbedingt die Berechtigung Dateien mit CGI zu erstellen. Einige Webhosting erfordern chmod 755 für das Verzeichnis, das Sie schreiben.

+0

Eine gute Idee könnte sein, eine Fehlerüberprüfung hinzuzufügen (überprüfe immer Fehler auf Systembefehlen wie open()) auf dem offenen Aufruf für die NUMPHOTOS-Datei, wenn du darauf schreibst. auch: Was ist die Fehlermeldung, wenn die Datei nicht erstellt wird und was ist der Dateiname, der generiert wird? –

+1

hinzufügen "verwenden streng;" und 'Warnungen verwenden'; Das Skript könnte Ihnen auch Hinweise geben, was falsch ist. –

3

Erste hinzufügen "use strict; use warnings; use diagnostics; use Fatal qw /: void open close /;" am Anfang Ihres Codes, nach #!.

my $ordinal=0; 
if (-e 'numpics.dat') { 
open (my $NUMPHOTOS, "<","numpics.dat"); 
$ordinal = <$NUMPHOTOS>; 
close ($NUMPHOTOS); 
} 
print "ordinal = $ordinal\n"; 
my $filename = sprintf("%08d.jpg", $ordinal); 

Auch ist es eine gute Idee zu lesen Ovid's CGI Course.

1

Wie jeder erwähnt, sollten Sie:

Verwendung Strikturen -

use strict; 
use warnings; 
use diagnostics; # will help you understand the error messages 

Überprüfen Sie den Dateinamen, das aktuelle Verzeichnis und die Berechtigungen für den Dateinamen zu schreiben;

Verwenden Sie die 3-Parameter geöffnet, und lexikalische Dateihandies, und überprüfen Sie die Operationen -

open my $uploadfile, '>', $filename or die "could not open $filename: $!"; 
print $uploadfile "Hello, uploadfile!\n" or die "could not print at $filename: $!"; 
close $uploadfile or die "could not close $filename: $!"; 
0
  1. druckt "Ordnungs = $ Ordnungs"; "ordinal = 42" drucken?
  2. Welche Nummer wird nach einem Lauf in numpics.dat gespeichert?
  3. Ist es möglich, dass das Skript 00000000.jpg immer und immer wieder schreibt?
0

Gibt es eine neue Zeile in der Datei? Was geschieht mit Ordnungs $, wenn Sie ändern:

$ordinal = <NUMPHOTOS>; 

zu

<NUMPHOTOS> =~ /(\d+)/ and $ordinal = $1; 

?

0

Hier ist mein Versuch, Ihr Programm zu reparieren.

Ich denke, das Problem der Mangel an chomp() war;

use strict; 
use warnings; 
use autodie; # don't need to check the return value of open() or close() 

my($filename, $ordinal); 

local $| = 1; 
print "Content-type: text/plain\n\n"; 

# NOTE: $ordinal is set to zero if the file doesn't exist 
{ 
    open(my $num_photos, '<', 'numpics.dat'); 
    $ordinal = <$num_photos>; 
    chomp $ordinal; # <-- 

    print "ordinal = $ordinal\n"; 
    $filename = sprintf("%08d.jpg", $ordinal); 
    print "filename = $filename\n"; 
    close ($num_photos); 
} 
{ 
    open(my $num_photos, '>', 'numpics.dat'); 
    $ordinal += 1; 
    print {$num_photos} $ordinal; 
    close($num_photos); 
} 
{ 
    open(my $upload_file, '>', $filename); 
    print "writing out file $filename...\n"; 
    print {$upload_file} 'hello world'; 
    close $upload_file; 
} 

Beachten Sie, dass dies immer noch nicht versucht, Locking-Probleme zu lösen. Also, wenn diese Atom sein muss, können Sie eine andere Frage

+0

Siehe 'perldoc -q 'Ich werde immer noch nicht gesperrt.'' Http://perldoc.perl.org/perlfaq5.html#I-still-don%27t-get-locking.--I-just-want - um die Nummer in der Datei zu erhöhen. - How-can-I-do-this% 3f –

+0

Das war nicht das Problem, das Problem war das Fehlen von 'chomp()'. –

Verwandte Themen