Что делать, если (-f <filename>) в Perl делать? - PullRequest
27 голосов
/ 30 мая 2011

Я наткнулся на эту строку кода:

if( -f <filename> ) { ... }

-f, кажется, проверяет, существует ли имя файла или нет, но я не уверен.Поиск в Google до сих пор не помог (Google плохо понимает "-f"), и мои книги по Perl тоже не нужны.

Может кто-нибудь посоветовать?

Ответы [ 5 ]

31 голосов
/ 30 мая 2011

См. perlfunc .

В нем перечислены все встроенные функции Perl, в том числе «тестовые»:

-X FILEHANDLE
-X EXPR
-X DIRHANDLE
-X

Где -X - этоодно из следующего:

-r: File is readable by effective uid/gid.
-w: File is writable by effective uid/gid.
-x: File is executable by effective uid/gid.
-o: File is owned by effective uid.

-R: File is readable by real uid/gid.
-W: File is writable by real uid/gid.
-X: File is executable by real uid/gid.
-O: File is owned by real uid.

-e: File exists.
-z: File has zero size (is empty).
-s: File has nonzero size (returns size in bytes).

-f: File is a plain file.
-d: File is a directory.
-l: File is a symbolic link.
-p: File is a named pipe (FIFO), or Filehandle is a pipe.
-S: File is a socket.
-b: File is a block special file.
-c: File is a character special file.
-t: Filehandle is opened to a tty.

-u: File has setuid bit set.
-g: File has setgid bit set.
-k: File has sticky bit set.

-T: File is an ASCII text file (heuristic guess).
-B: File is a "binary" file (opposite of -T).

-M: Script start time minus file modification time, in days.
-A: Same for access time.
-C: Same for inode change time (Unix, may differ for other platforms)
7 голосов
/ 30 мая 2011

В Unix каталоги могут содержать файлы следующих типов:

  • Обычный (что вы считаете файлом)
  • Каталог
  • Именованный канал
  • Именованный сокет
  • ...

-f проверяет, ссылается ли указанное имя на файл, который является простым файлом.Он вернет undef (ошибка ENOENT), если файл не существует, или некоторые другие ложные значения, если файл существует, но не является простым файлом (например, если это каталог).

-X операторы

4 голосов
/ 30 мая 2011
2 голосов
/ 30 мая 2011

if (-f <filename> ) { ... }

Кажется, что либо я неправильно понял вопрос, либо кто-то другой понял.

Сначала давайте сделаем некоторые предположения.

  1. Предположим, что вы не перегрузили все унарные операторы -X с префиксом (это либо все, либо ни одного из них),

  2. Давайтетакже предположим, что вы не перегружены итерационным оператором <>.

Если предположить, что оба из этих двух данных, указанных выше, выполнены, то запись <filename> выполнит scalar readline(*filename) - который зависит от значения $/ - и затем передать этот результат оператору проверки файлов для последующей оценки, обычно, но не обязательно, с помощью stat (2).Это означает, что вам лучше всего открыть файловый дескриптор с именем filename, чтобы это работало, если только не задействовано действительно глубокое волшебство.

If также сделает это для <$filename>, за исключением теперь $filenameявляется косвенным дескриптором вместо прямого, например filename.Опять же, $/ соблюдается.Использование имени файла, подходящего для файлового дескриптора, связанного с ним, - это то, что я делаю весь термин.Например:

our $fn = "/etc/termcap";
open($fn, "<", $fn) || die "can't open $fn: $!";

Таким образом, сообщения warn и die фактически сообщают мне имя файла.Например:

while (<$fh>) {
     warn "oops" if whatever;
}

сообщит мне номер строки и имя файла, в котором я остановился.

Теперь, если операнд <⋯> отклоняется от правил дляДопускаются несвязанные дательные объекты, то есть голое слово с префиксом ноль или более знаков доллара, тогда это не оператор итерации, а групповой символ.Это верно даже без подстановочных знаков.Это просто должно нарушить знаменитое Perl Правило Datives , и это затем вызывает альтернативное

Это означает, что тогда и только тогда, когда filename не является законнымголое слово с нулем или большим количеством начальных знаков доллара - например, /etc/termcap, /tmp, *.[Cchy], {,/usr}/bin/c? или ~/Documents - тогда этот знакомый старый оператор конглобуляции в руководстве функции File::Glob::bsd_glob имеет видвызывается вместо того, чтобы получить именно тот результат, который вы ожидаете получить от такой полезной и часто используемой функции при наличии соответствующего аргумента.

Вот много примеров, которые показывают ответы на вопросы такого рода, о которых говорилось в приведенной выше части.на самом деле спрашивает:

use v5.10;  # for the say feature, but not needed for conglobulation

if (-d <~joebob>                 ) { say "joebob has a home"                 }
if (-d <~joebob/.opera>          ) { say "joebob has an opera directory"     }
if (-d <~joebob/.ssh>            ) { say "joebob has an ssh directory"       }

if ($n = grep {-e} <~joebob/.*rc>) { say "joebob has $n RC files"            }

if (-f <~joebob/.exrc>           ) { say "joebob has a vi config file"       }
if (-f <~joebob/.profile>        ) { say "joebob has a sh profile"           }
if (-f <~joebob/.bashrc>         ) { say "joebob has a bash config script"   }
if (-f <~joebob/.cshrc>          ) { say "joebob has a csh config script"    }
if (-f <~joebob/.log{in,out}*>   ) { say "joebob has csh login/out scripts"  }

if (-S </tmp/.X*/X*>             ) { say "I smell an X11 socket"             }

if (-t STDIN && -t STDOUT        ) { say "smells pretty tty to me"           } 
0 голосов
/ 30 мая 2011

Он проверяет, является ли объект, указанный в <filename>, простым файлом (в отличие от двоичного файла или каталогом и т. Д.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...