2009-07-31 52 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, 
     )]; 
} 
相關問題