2009-07-31 54 views
0

我正在努力创建一个脚本,为我创建图像画廊。如何在Perl中创建和追加带有可变路径的文件?

当我跑我有什么告诉我

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

这里是我到目前为止已经得到的代码。

#!/etc/perl -w 

#CHANGE THIS 
$filecategory = "cooking"; 

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

@imagelocation = <$imagedirectory/*>; #*/ 
$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; 
} 

我想要它做的是创建文件,打开它,写入东西,然后关闭/保存它。我怎样才能利用我所拥有的,做到这一点?

这里是修复:

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

回答

7

我认为这个问题是在这里:

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

具体来说,这些字符串的开头"\"\""结束,这意味着你的文件和文件夹将用双引号包围。因此,Perl不会尝试打开/media/New Volume/etc...,但"/media/New Volume/etc...",因为没有名为"的目录,所以它不存在。你超过了引号。

你可以(也应该总是)做一件事,让你的代码更好,就是use strict;。我看到你已经在顶部有use warnings;,这很好,但同时使用strictwarnings将使你的代码更安全和更好看。

+0

是的 - 你得到它 - 好一个! ;) – 2009-07-31 18:43:29

2

IMNHO,真正的答案是使用File::Spec和写的东西更清楚一点:

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

此外,它是观察的好习惯是个好主意,特别是因为你刚开始学习的Perl:

始终把:

use strict; 
use warnings; 

为你的程序中的第一件事。

使用词法文件句柄而不是裸字的文件句柄(这是包全局):

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

,并包括在错误信息的文件的名称。

最后,我喜欢File::Slurpappend_file

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

这里是你的程序的修订版本:

#!/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, 
     )]; 
} 
相关问题