2009-07-31 9 views
0

Je travaille à la création d'un script qui créera des galeries d'images pour moi.Comment créer et ajouter des fichiers avec des chemins variables en Perl?

Quand je lance ce que je l'ai me dit

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

Voici le code que j'ai obtenu jusqu'à présent. Ce que je veux faire est de créer le fichier, l'ouvrir, y écrire des choses, puis le fermer/le sauvegarder. Comment puis-je, en utilisant ce que j'ai, le faire?

Voici le correctif:

#!/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; 
    } 

Répondre

7

Je pense que le problème est ici:

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

Plus précisément, chacune de ces chaînes commence par "\" et se termine par \"", ce qui signifie que vos fichiers et les dossiers seront entourés de guillemets. Donc Perl n'essaie pas d'ouvrir /media/New Volume/etc..., mais "/media/New Volume/etc...", ce qui n'existe pas car il n'y a pas de répertoire appelé ". Vous sur-citant.

Une chose que vous pouvez (et devriez toujours) faire pour améliorer votre code est de use strict;. Je vois que vous avez déjà use warnings; en haut là, ce qui est bon, mais en utilisant à la fois strict et warnings rendra votre code beaucoup plus sûr et plus agréable à regarder.

+0

Yep - vous l'avez - nice one! ;) –

+0

Merci pour votre aide. – aggitan

+0

Veillez à corriger les deux variables, pas une seule. Je pense. –

2

IMNHO, la vraie réponse consiste à utiliser File::Spec et écrire des choses un peu plus clair:

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", 
); 

En outre, il est une bonne idée d'observer de bonnes habitudes, d'autant plus que vous êtes juste Perl d'apprentissage:

Mettez toujours:

use strict; 
use warnings; 

comme première chose dans votre programme.

Utilisez lexicales handles de fichiers plutôt que bareword (qui sont handles de fichiers paquet global):

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

et comprennent le nom du fichier dans le message d'erreur.

Enfin, j'aime File::Slurp « s append_file:

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

Voici une version révisée de votre programme:

#!/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, 
     )]; 
} 
Questions connexes