Изменение имени файла Perl - PullRequest
0 голосов
/ 15 марта 2011

Я изучаю и расширяю Perl-скрипт, написанный другими.У него есть строка:

@pub=`ls $sourceDir | grep '\.htm' | grep -v Default |  head  -550`;
foreach (@pub) {

   my $docName = $_;
   chomp($docName);
   $docName =~ s/\.htm$//g;
    ............}

Я знаю, что сначала она использует команду UNIX для удаления всех файлов htm, а затем избавляется от расширения файла.

Теперь мне нужно сделать одинвещь, которая тоже очень важна.То есть мне нужно изменить имя сохраненного файла, заменив пробел подчеркиванием.Я застрял здесь, потому что я не уверен, должен ли я следовать его стилю кода, достигая этого с помощью UNIX, или я должен делать это в Perl?Дело в том, что мне нужно изменить реальный файл на диске, а не строку, которая использовалась для хранения имени файла.

Спасибо.

Ответы [ 2 ]

3 голосов
/ 15 марта 2011

Как то так должно помочь (не проверено)

use File::Basename;
use File::Spec;
use File::Copy;
use strict;

my @files = grep { ! /Default/ } glob("$sourceDir/*.htm");
# I didn't implement the "head  -550" part as I don't understand the point.
# But you can easily do it using `splice()` function.

foreach my $file (@files) {
    next unless (-f $file);   # Don't rename directories!
    my $dirname = dirname($file); # file's directory, so we rename only the file itself.
    my $file_name = basename($file); # File name fore renaming.
    my $new_file_name = $file_name;
    $new_file_name =~ s/ /_/g; # replace all spaces with underscores
    rename($file, File::Spec->catfile($dirname, $new_file_name))
        or die $!; # Error handling - what if we couldn't rename?
}
2 голосов
/ 15 марта 2011

Будет быстрее использовать File :: Copy , чтобы переместить файл с новым именем, а не использовать этот метод, который запускает новый процесс, порождает новую оболочку и т. Д., Он занимает больше памятии медленнее, чем это делает внутри самого Perl.

edit .. вы можете избавиться от всего этого backtick bs, например,

my @files = grep {!/Default/} glob "$sourcedir/*.html";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...