2009-07-31 2 views
0

Ich arbeite mich nach oben in Richtung eines Skripts, das Bildergalerien für mich erstellen wird.Wie kann ich Dateien mit variablen Pfaden in Perl erstellen und anhängen?

Wenn ich laufe, was ich habe es mir

No such file or directory at photographycreate line 16. 
------------ 
(program exited with code: 2) 

erzählt Hier ist der Code, die ich bisher bekommen habe.

Was ich will, ist es, die Datei zu erstellen, öffnen Sie es, schreiben Sie Zeug, und schließen Sie dann/speichern Sie es. Wie kann ich das, was ich habe, tun? Hier

ist fix:

#!/etc/perl -w 
use Fcntl; #The Module 
use strict; 

#CHANGE THIS 
my $filecategory = "cooking"; 

my $filenumber = 0; 
my $imagedirectory = "\"/media/New Volume/Programming/kaiproduct/media/photography/".$filecategory."/images/\""; 
my $galleryfile = "/media/New Volume/Programming/kaiproduct/pages/".$filenumber."_".$filecategory."_gallery.html"; 

my @imagelocation = <$imagedirectory/*>; #*/ 
my $filecount = @imagelocation; 

while($filenumber < 3) 
    { 
     open GALLERY, "+>", $galleryfile or die $!; 
     print (GALLERY $filecount."\n"); 
     print (GALLERY $imagedirectory."\n"); 
     print (GALLERY $galleryfile."\n"); 
     close GALLERY; 

     ++$filenumber; 
    } 

Antwort

7

denke ich, ist das Problem hier:

$imagedirectory = "\"/media/New Volume/Programming/kai product/media/photography/".$filecategory."/images/\""; 
$galleryfile = "\"/media/New Volume/Programming/kai product/pages/".$filenumber."_".$filecategory."_gallery.html\""; 

Insbesondere ist jeder dieser Zeichenfolgen beginnt mit "\" und endet mit \"", was bedeutet, dass Ihre Dateien und Ordner werden in doppelte Anführungszeichen eingeschlossen. Also versucht Perl nicht, /media/New Volume/etc... zu öffnen, aber "/media/New Volume/etc...", das nicht existiert, weil es kein Verzeichnis gibt, das " genannt wird. Du sprichst über.

Eine Sache, die Sie tun können (und immer tun sollten), um Ihren Code besser zu machen, ist use strict;. Ich sehe, Sie haben bereits use warnings; an der Spitze, das ist gut, aber mit beiden strict und wird Ihren Code viel sicherer und schöner zu betrachten.

+0

Ja - Sie haben es - nice one! ;) –

+0

Danke für Ihre Hilfe. – aggitan

+0

Achten Sie darauf, beide Variablen zu korrigieren, nicht nur eine. Ich denke. –

2

IMNHO, die wirkliche Antwort ist File::Spec zu verwenden und schreiben Dinge etwas klarer:

use File::Spec::Functions qw(catfile); 

# ... 

my $root = "/media/New Volume/Programming/kai product"; 

my $imagedirectory = catfile($root, 
    'photography', 
    $filecategory, 
    'images', 
); 

my $galleryfile = catfile($root, 
    'pages', 
    "${filenumber}_${filecategory}_gallery.html", 
); 

Darüber hinaus ist es eine gute Idee, gute Gewohnheiten zu beobachten, vor allem, weil Sie gerade Perl lernen:

immer gesagt:

use strict; 
use warnings; 

als die Erste Sache in Ihrem Programm.

Verwendung lexikalische Dateihandies statt Bareword Dateihandies (das Paket global):

open my $gallery, '+>', $galleryfile 
    or die "Cannot open '$galleryfile': $!; 

und umfassen die Namen der Datei in der Fehlermeldung.

Schließlich möchte ich File::Slurp ‚s append_file:

append_file $gallery_file, [ 
    map { "$_\n" } ($filecount, $imagedirectory, $galleryfile) 
]; 

Hier ist eine überarbeitete Version des Programms ist:

#!/etc/perl 

use strict; 
use warnings; 

use File::Spec::Functions qw(catfile); 

my $root = "/media/New Volume/Programming/kai product"; 
my $filecategory = "cooking"; 

my $imagedirectory = catfile($root, 
    'photography', 
    $filecategory, 
    'images', 
); 

my @imagelocation = read_dir $imagedirectory; 

for my $filenumber (0 .. 2) { 

    my $galleryfile = catfile($root, 'pages', 
     "${filenumber}_${filecategory}_gallery.html", 
    ); 

    append_file $gallery_file, [ 
     map { "$_\n" } ( 
      scalar @imagelocation, $imagedirectory, $galleryfile, 
     )]; 
} 
Verwandte Themen