Объединение нескольких файловых проверок позволяет создавать сложные логические условия. Предположим, программа должна выполнить некую операцию только с файлами, доступными как для чтения, так и для записи. Проверки атрибутов объединяются оператором 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];
}