-X(-e, -f, ..) - Операторы проверки файлов
- -X FILEHANDLE
- -X EXPR
- -X DIRHANDLE
- -X
Проверка файла, где X - один из перечисленных далее символов. Унарный оператор принимает один аргумент, это может быть имя файла, файловый дескриптор, либо дескриптор каталога, и проверяет соответствующий файл на соответствие условию. Ели аргумент не указан, проверяет
$_, кроме работы с ключом-t, который использует STDIN. Если не оговорено иное, возвращает1для успешной проверки и''для не успешной, либо неопределенное значение если файл не существует. Несмотря на забавные имена, приоритет у файловых проверок такой же как и у прочих именованных унарных операторов. Оператор может быть один из:-r Файл доступен для чтения текущему пользователю или группе (efective uid/gid) -w Файл доступен для записи текущему пользователю или группе (effective uid/gid) -x Файл доступен для выполнения текущему пользователю или группе (effective uid/gid) -o Файл принадлежит текущему пользователю (effective uid) -R Файл доступен для чтения реальному пользователю или группе (real uid/gid) -W Файл доступен для записи реальному пользователю или группе (real uid/gid) -X Файл доступен для выполнения реальному пользователю или группе (real uid/gid) -O Файл принадлежит реальному пользователю (real uid) -e Файл существует -z Файл имеет нулевой длины (пуст) -s Файл имеет ненулевую длину ( возвращает размер в байтах ) -f Обычный файл. -d Файл является каталогом. -l Файл является символической ссылкой. -p Файл либо файловый дескриптор являются именованным каналом (FIFO). -S Файл является сокетом. -b Блочный файл. -c Символьный файл. -t Дескриптор файла открыт в текущем терминале(tty). -u Для файла установлен бит setuid -g Для файла установлен бит setgid -k Для файла установлен "липкий бит" (sticky bit) -T Файл является текстовым в формате ASCII (эвристическая догадка). -B Файл является "Двоичным"(бинарным) (в противоположность -T). -M Время, прошедшее от последней модификации файла до запуска сценария, в днях. -A Время, прошедшее от последнего обращения к файлу до запуска сценария, в днях. -C Время, прошедшее от последнего изменения индексного дескриптора(inode) до запуска сценарияНапример:
while (<>) { chomp; next unless -f $_; # пропустить "особые" файлы #... }
Note that
-s/a/b/does not do a negated substitution. Saying-exp($foo)still works as expected, however: only single letters following a minus are interpreted as file tests.These operators are exempt from the "looks like a function rule" described above. That is, an opening parenthesis after the operator does not affect how much of the following code constitutes the argument. Put the opening parentheses before the operator to separate it from code that follows (this applies only to operators with higher precedence than unary operators, of course):
-s($file) + 1024 # probably wrong; same as -s($file + 1024) (-s $file) + 1024 # correctИнтерпретация операторов прав доступа
-r,-R,-w,-W,-xи-Xосновывается исключительно на свойствах файла и пользовательском и групповом идентификаторах пользователя (uids, gids). Могут быть другие причины, по которым не удается читать, записывать или выполнять файл, например, управление доступом сетевых файловых систем, ACL (списки управления доступом), файловые системы только для чтения, и нераспознанные форматы исполняемого файла. Заметим, что использование вышеупомянутых шести операторов для тестирования файла, может привести к ошибке в случае, если в это время над файлом производятся какие либо операциии, что может вызвать зависание, состояние гонки и прочие неприятности.Также отметим, что для суперпользователя на локальной файловой системе, проверки
-r,-R,-wи-Wвсегда возвращают 1, а-xи-Xвозвращают 1, если установлен хоть один бит исполнения. Поэтому в сценариях, выполняемых суперпользователем, может потребоваться выполнение stat(), чтобы определить действительный режим файла, либо временно установить другой идентификатор пользователя(анг. effective uid).If you are using ACLs, there is a pragma called
filetestthat may produce more accurate results than the bare stat() mode bits. When underuse filetest 'access'the above-mentioned filetests test whether the permission can(not) be granted using the access(2) family of system calls. Also note that the-xand-Xmay under this pragma return true even if there are no execute permission bits set (nor any extra execute permission ACLs). This strangeness is due to the underlying system calls' definitions. Note also that, due to the implementation ofuse filetest 'access', the_special filehandle won't cache the results of the file tests when this pragma is in effect. Read the documentation for thefiletestpragma for more information.Ключи
-Tи-bработают следующим образом. Участок файла примерно в объеме первого блока исследуется на наличие необычных символов, таких как коды управления или байты с установленным старшим битом (не похожие на UTF-8). Если необычных символов слишком много (больше 30%), то файл считается двоичным(-B), иначе это текстовый(-T) файл. Также, любой файл считается двоичным, если он содержит в первом блоке нулевой байт ( символ ASCII NUL(\0) ). Если-Tили-Bприменяется к дескриптору файла, то исследуется не первый блок файла, а текущий буфер ввода ( стандартный I/O или "stdio"). Оба оператора-Tи-Bвозвращают истину для пустого файла, или файла, указатель которого находится в EOF - конце файла, если проверяется дескриптор. Поскольку нужно прочесть файл, чтобы выполнить проверку-T, в большинстве случаев лучше сначала сделать проверку с ключом-f, напримерnext unless -f $file && -T $file.If any of the file tests (or either the
statorlstatoperator) is given the special filehandle consisting of a solitary underline, then the stat structure of the previous file test (or stat operator) is used, saving a system call. (This doesn't work with-t, and you need to remember that lstat() and-lleave values in the stat structure for the symbolic link, not the real file.) (Also, if the stat buffer was filled by anlstatcall,-Tand-Bwill reset it with the results ofstat _). Example:print "Доступен для обработки do.\n" if -r $a || -w _ || -x _; stat($filename); print "Доступен для чтения \n" if -r _; print "Доступен для записи \n" if -w _; print "Исполняемый \n" if -x _; print "Установлен бит setuid\n" if -u _; print "Установлен бит setgid\n" if -g _; print "Установлен 'липкий бит'\n" if -k _; print "Текстовый\n" if -T _; print "Бинарный\n" if -B _;
Начиная с версии Perl 5.9.1, как форма синтаксического сахара может использоваться стек операторов тестирования файла. Таким образом,
-f -w -x $fileэквивалентно-x $file && -w _ && -f _. (Но если использовать возвращаемое значение-f $fileв качестве аргумента для другого оператора, никакой особой магии не произойдет.)