Проверьте, не является ли файл НЕ каталогом в Perl - PullRequest
6 голосов
/ 11 октября 2011

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

if(-d $filename)

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

Ответы [ 4 ]

15 голосов
/ 11 октября 2011

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

if (! -d $filename) ...

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

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

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

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

if ((-e $filename) && (! -d $filename)) ...
5 голосов
/ 11 октября 2011

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

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

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

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

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

3 голосов
/ 11 октября 2011

В духе TIMTOWTDI :

unless (-d $filename)
2 голосов
/ 11 октября 2011

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

if (-f $filename) { ...
...