Проверка нескольких атрибутов одного файла

Объединение нескольких файловых проверок позволяет создавать сложные логические условия. Предположим, программа должна выполнить некую операцию только с файлами, доступными как для чтения, так и для записи. Проверки атрибутов объединяются оператором and:

if( -r $file and -w $file ) {
... }

Однако объединение проверок обойдется весьма недешево. При каждой проверке Perl обращается к файловой системе с запросом всей информации о файле (фактически Perl каждый раз выполняет системную функцию stat, о которой будет рассказано в следующем разделе). Хотя информация уже была получена при проверке –r, Perl снова запрашивает ее для проверки –w. Как неэффективно! При проверке атрибутов большого количества файлов могут возникнуть серьезные проблемы с быстродействием. В Perl существует специальная сокращенная запись, которая позволит обойтись без напрасной работы. Виртуальный файловый дескриптор _ (просто символ подчеркивания) использует информацию, полученную в результате выполнения последнего оператора проверки файла. Теперь Perl достаточно запросить информацию о файле всего один раз:

if( -r $file and -w _ ) {
... }

Для использования _ проверки файлы необязательно располагать рядом друг с другом.


\ Здесь они размещаются в разных условиях if:

if( -r $file ) {
print "The file is readable!\n";
}
if( -w _ ) {
print "The file is writable!\n";
}

Однако будьте внимательны и следите за тем, чтобы содержимое _ относилось именно к тому файлу, который вам нужен. Если между проверками происходит что-то еще, например вызов пользовательской функции, информация о последнем файле может измениться. Например, в следующем примере вызывается функция lookup, в которой так-же выполняется своя проверка. При возврате и выполнении другой проверки файловый дескриптор _ содержит не данные $file, как мы ожидаем, а данные $other_file:

if( -r $file ) {
print "The file is readable!\n";
}
lookup( $other_file );
if( -w _ ) {
print "The file is writable!\n";
}
sub lookup {
return -w $_[0];
}

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

Статьи из раздела Perl на эту тему:
Операторы проверки файлов
Поразрядные операторы
Работа с битовыми строками
Сгруппированная проверка файлов
Функции stat и lstat