if (-f <filename> ) { ... }
Кажется, что либо я неправильно понял вопрос, либо кто-то другой понял.
Сначала давайте сделаем некоторые предположения.
Предположим, что вы не перегрузили все унарные операторы -X
с префиксом (это либо все, либо ни одного из них),
Давайтетакже предположим, что вы не перегружены итерационным оператором <>
.
Если предположить, что оба из этих двух данных, указанных выше, выполнены, то запись <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" }