Переименование файлов

Функция 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.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Perl на эту тему:
Альтернативный синтаксис глобов
Глобы
Дескрипторы каталогов
Изменение временных меток
Изменение разрешений

Вернуться в раздел: Perl / 12. Операции с каталогами