Переименовать файл с помощью Perl - PullRequest
1 голос
/ 05 апреля 2010

У меня есть файл в другой папке, которую я хочу переименовать в perl, ранее я искал решение, которое показывало что-то вроде этого:

#rename
for (<C:\\backup\\backup.rar>) {
    my $file = $_;
    my $new = $file . 'backup' . $ts . '.rar';  
    rename $file, $new or die "Error, can not rename $file as $new: $!";
}

однако backup.rar находится в другой папке, я попытался поместить «C: \ backup \ backup.rar» в <> выше, однако я получил ту же ошибку.

C:\Program Files\WinRAR>perl backup.pl
String found where operator expected at backup.pl line 35, near "$_ 'backup'"
        (Missing operator before 'backup'?)
syntax error at backup.pl line 35, near "$_ 'backup'"
Execution of backup.pl aborted due to compilation errors.

Я использовал

# Get time
my @test = POSIX::strftime("%m-%d-%Y--%H-%M-%S\n", localtime);
print @test;

Чтобы узнать текущее время, я, похоже, не смог правильно указать переименовать .

Что я могу сделать, чтобы это исправить? Обратите внимание, что я делаю это в окне Windows.

Ответы [ 4 ]

2 голосов
/ 05 апреля 2010

Обратите внимание на фактическое сообщение об ошибке. Посмотрите на строку:

my $new = $_ 'backup'. @test .'.rar';

Если вы хотите интерполировать содержимое $_ и массив @test в такую ​​строку, вам нужно использовать:

my $new = "${_}backup@test.rar";

но мне трудно это понять.

Теперь strftime возвращает скаляр. Почему бы не использовать:

my $ts = POSIX::strftime("%m-%d-%Y--%H-%M-%S", localtime);
my $new = sprintf '%s%s%s.rar', $_, backup => $ts;

Кстати, вы могли бы в конечном итоге сделать свою жизнь намного проще, если бы сначала поставили отметку времени и отформатировали ее как YYYYMMDD-HHMMSS, чтобы не было путаницы относительно того, какая дата 04-05-2010 относится.

1 голос
/ 05 апреля 2010

Линия

my $new = $_ 'backup'. @test .'.rar';

вероятно, следует читать

my $new = $file . 'backup' . @test . '.rar';

(Вы пропустили оператор конкатенации, и более понятно использовать именованную переменную из строки перед повторным использованием $_ там ...)

0 голосов
/ 06 апреля 2010

Небольшая проблема, но вам не нужно

for (<C:\\backup\\backup.rar>) {
   my $file = $_;
   .....
}

Конструкция < > будет полезна, если вы расширяете подстановочный знак, но это не так. Подумайте о будущих читателях этого кода (вы через год!) И напишите

my $file = 'C:\backup\backup.rar' ;

Обратите внимание на одинарные кавычки, которые не расширяют обратную косую черту.

0 голосов
/ 05 апреля 2010

Я думаю, что вы пропустили символ строки concat. (период):

my $new = $_ 'backup'. @test .'.rar';

должно быть

my $new = $_ . 'backup' . @test . '.rar';
...