Как мне создавать и добавлять файлы с переменными путями в Perl? - PullRequest
0 голосов
/ 31 июля 2009

Я работаю над созданием сценария, который создаст для меня галереи изображений.

Когда я запускаю то, что у меня есть, это говорит мне

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;
    }

Ответы [ 2 ]

7 голосов
/ 31 июля 2009

Я думаю, что проблема здесь:

$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; наверху, и это хорошо, но использование strict и warnings сделает ваш код намного безопаснее и приятнее для просмотра.

2 голосов
/ 31 июля 2009

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 :: Slurp 's append_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,
        )];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...