Функция rename присваивает новое имя существующему файлу:
rename "old", "new";
Как и аналогичная команда UNIX mv, она берет файл с именем old и присваивает ему имя new в том же каталоге. Переименование даже может сопровождаться перемещением файла:
rename "over_there/some/place/some_file", "some_file";
Команда перемещает файл some_file из другого каталога в текущий каталог при условии, что пользователь, запустивший программу, обладает соответствующими разрешениями. Как и большинство функций, обращающихся с запросами к операционной системе, rename возвращает false в случае неудачи и устанавливает $! при ошибке операционной системы, о чем можно (и нужно) сообщить пользователю при помощи or die или or warn. В группах новостей, посвященных использованию командных интерпретаторов UNIX, часто2 встречается один вопрос: можно ли переименовать все файлы с расширением .old так, чтобы они сохранили прежние имена, но получили расширение .new? Вот как это делается в Perl:
foreach my $file (glob "*.old") {
my $newfile = $file;
$newfile =~ s/\.old$/.new/;
if (-e $newfile) {
warn "can't rename $file to $newfile: $newfile exists\n";
} elsif (rename $file, $newfile) {
## Успешное переименование, ничего не делать
} else {
warn "rename $file to $newfile failed: $!\n";
}
}
Проверка существования $newfile необходима из-за того, что rename преспокойно запишет переименованный файл на место существующего (если пользователь обладает разрешениями на удаление соответствующего файла). Мы вставили эту проверку, чтобы свести к минимуму возможную потерю информации. Конечно, если вы хотите заменять существующие файлы вида wilma.new, проверка –e не нужна. Первые две строки цикла обычно объединяются в следующей записи:
(my $newfile = $file) =~ s/\.old$/.new/;
Программа объявляет переменную $newfile, копирует ее исходное значение из $file, а затем преобразовывает $newfile по результатам замены. Команду можно прочитать в виде «преобразовать $file в $newfile с использованием замены в правой части». Круглые скобки необходимы из-за относительных приоритетов операций. Впервые увидев эту замену, некоторые программисты интересуются, почему обратная косая черта необходима слева, а не справа. Две стороны не симметричны: в левой части стоит регулярное выражение, а в правой – строка в кавычках. Соответственно мы используем шаблон /\.old$/, означающий «.old с привязкой к концу строки» (привязка нужна, чтобы предотвратить замену первого вхождения .old в файле betty.old.old), а в правой части можно просто записать заменяющую строку .new.