Проверить, является ли файл НЕ каталогом в Perl

Я знаю, что вы можете проверить, является ли файл каталогом, используя:

if(-d $filename)

но как вы можете проверить, если это не каталог?


person sj755    schedule 11.10.2011    source источник
comment
возможный дубликат Как отличить файл от каталог в Perl?   -  person Greg Hewgill    schedule 11.10.2011
comment
Канонический вопрос о переполнении стека: Как отличить файл от каталога в Perl?.   -  person Peter Mortensen    schedule 04.09.2013


Ответы (4)


Вы не думали попробовать следующее?

if (! -d $filename) ...

В конце концов, результат -d можно рассматривать как логическое значение, поэтому логический оператор not ! будет работать нормально.

А если вам нужно что-то более конкретное, чем "не каталог", см. здесь. Есть довольно много вещей, которые не являются каталогами, и иногда не имеет смысла обращаться с ними как с обычными файлами.

Имейте в виду, что предполагается, что вы уже подтвердили, что имя файла существует. Если вы сделаете ! -d для несуществующего имени файла, будет возвращено значение true.

Это философский вопрос, считаете ли вы несуществующую вещь «не каталогом», но если вы хотите убедиться, что она также существует, вы можете использовать ! -d в сочетании с -e, что-то вроде:

if ((-e $filename) && (! -d $filename)) ...
person paxdiablo    schedule 11.10.2011
comment
Я просто не мог достаточно быстро набрать 30 символов... Я думаю, что вопрос на самом деле ошеломил меня. - person Brian Roach; 11.10.2011
comment
Обратите внимание: в зависимости от того, как вы анализируете потребность OP, этот ответ может быть неправильным. Как я это проанализировал, он хочет знать, является ли что-то файлом, НО не каталогом - этот ответ вернет true даже для чего-то, что НЕ является файлом в первую очередь (например, !-d NO_SUCH_FILE возвращает true). - person DVK; 11.10.2011

Чтобы проверить, является ли что-то файлом, НО не каталогом, вам нужно просто объединить 2 теста (единого теста нет):

if (-e $file && !-d $file) { # a file but not a directory }

Обратите внимание, что:

  • При всем уважении, ответ paxdiablo неверен из-за того, как сформулирован вопрос (чистый !-d не работает для того, что задал пользователь, поскольку он проверяет, не является ли случайная вещь/строка каталогом, НЕ является ли что-то файлом, который не является каталог). Например. !-d NO_SUCH_FILE возвращает истину.

  • Ответ Грега может быть правильным полностью в зависимости от того, намеревался ли первоначальный пользователь включать непростые файлы (например, символические ссылки, именованные каналы и т. д.) в свое определение «файла, который не является каталогом». Если они хотели включить все эти специальные «файлы», ответ Грега также неверен, поскольку «-f» исключает их (как мудро заметил Грег в своем ответе в первую очередь).

person DVK    schedule 11.10.2011

В духе TIMTOWTDI:

unless (-d $filename)
person Ilmari Karonen    schedule 11.10.2011
comment
Хотя очень элегантно - person Pavel; 27.01.2017

Оператор -f проверяет, является ли что-то «обычным файлом». Это исключает каталоги, но также исключает такие вещи, как каналы и узлы устройств.

if (-f $filename) { ...
person Greg Hewgill    schedule 11.10.2011