На этом шаге мы рассмотрим унарные операции.
В Perl предусмотрен набор унарных операций, возвращающих значение только одного поля структуры индексного дескриптора. Эти операции в документации называются "операциями -X", так как их названия состоят из дефиса с последующим единственным символом. Все они являются унарными именованными операциями и имеют свой приоритет в сложных выражениях. Полный перечень унарных операций проверки атрибутов файлов представлен в таблице 1.
Операция | Проверяемый атрибут |
---|---|
-r | Файл может читаться эффективным uid/gid. |
-w | Записывать в файл может эффективный uid/gid. |
-x | Файл может выполняться эффективным uid/gid. |
-o | Владельцем файла является эффективный uid. |
-R | Файл может читаться действительным uid/gid. |
-W | Записывать в файл может действительный uid/gid. |
-X | Файл может выполняться действительный uid/gid. |
-O | Владельцем файла является действительный uid. |
-e | Файл существует. |
-z | Размер файла равен нулю. |
-s | Размер файла отличен от нуля (возвращается размер). |
-f | Файл является обычным (plain) файлом. |
-d | Файл является каталогом. |
-l | Файл является символической ссылкой. |
-p | Файл является именованным программным каналом (FIFO) или проверяемый дескриптор связан с программным каналом. |
-S | Файл является сокетом. |
-b | Файл является специальным блочным файлом. |
-c | Файл является специальным символьным файлом. |
-t | Дескриптор файла связан с терминалом. |
-u | У файла установлен бит setuid. |
-g | У файла установлен бит setgid. |
-k | У файла установлен бит запрета (sticky bit). |
-T | Файл является текстовым файлом. |
-B | Файл является двоичным (противоположным текстовому). |
-M | Возраст файла в днях на момент выполнения программы. |
-A | То же для времени последнего обращения к файлу. |
-C | То же для времени последней модификации индексного дескриптора файла. |
Унарные операции применяются к строке, содержащей имя файла, к выражению, вычисляемым значением которого является имя файла, или к файловому дескриптору Perl. Если параметр операции не задан, то она тестирует файл, чье имя содержится в специальной переменной $_. Каждая операция проверки атрибута файла возвращает 1, если файл обладает соответствующим атрибутом, пустую строку "" в противном случае и неопределенное значение undef, если указанный в параметре файл не существует.
Несколько слов об алгоритме определения текстовых и двоичных файлов (операции -T и -B). Эти операции анализируют содержимое первого блока файла на наличие "странных" символов - необычных управляющих последовательностей или байтов с установленными старшими битами. Если обнаружено достаточно большое количество подобных символов (больше 30%), то файл считается двоичным, иначе текстовым. Любой файл с пустым первым блоком рассматривается как двоичный.
Если эти операции применяются к файловым дескрипторам Perl, то проверяется содержимое буфера ввода/вывода, а не первого блока файла. Обе эти операции, примененные к файловым дескрипторам, возвращают булево значение Истина, если связанный с дескриптором файл пуст или установлен на конец файла.
При выполнении унарных именованных операций проверки файла на самом деле неявно вызывается функция stat(), причем результаты ее вычисления кэшируются, что позволяет использовать специальный файловый дескриптор _ для ускорения множественных проверок файла:
if( -s ("filename") && -Т _) {
# Что-то делаем для текстовых файлов не нулевого размера.
. . . . . .
. . . . . .
}
На следующем шаге мы рассмотрим операции с каталогами.