В Perl, как я могу проверить наличие опций Socket без генерации предупреждений? - PullRequest
4 голосов
/ 07 февраля 2010

Я проверяю наличие и значения по умолчанию различных опций сокетов, используя Perl.

#!/usr/bin/perl -w
use strict;
use Socket;

if (defined(SO_BROADCAST)) {
    print("SO_BROADCAST defined\n");
}

if (defined(SO_REUSEPORT)) {
    print("SO_REUSEPORT defined\n");
}

Когда я запускаю это, он выдает:

SO_BROADCAST defined

Your vendor has not defined Socket macro SO_REUSEPORT, used at ./checkopts.pl line 9

Есть ли способ сделать это без генерации предупреждений на выходе?

Ответы [ 2 ]

9 голосов
/ 07 февраля 2010

Это сообщение приходит от AUTOLOAD в Socket.pm. Когда он находит константу, которая не поддерживается, он croak s. Вы можете поймать это с eval :

 use Socket;

 if( defined eval { SO_REUSEPORT } ) {
      ...;
      }
1 голос
/ 09 февраля 2010

Спросите, было ли определено подпрограмма, а не определено ли значение выражения:

if (defined &SO_REUSEPORT) { ... }

Документация для defined объясняет:

Вы также можете использовать defined(&func), чтобы проверить, была ли когда-либо определена подпрограмма &func. На возвращаемое значение не влияют никакие предварительные декларации &func. Обратите внимание, что подпрограмма, которая не определена, может все еще вызываться: ее пакет может иметь метод AUTOLOAD, который заставляет его возникать при первом вызове - см. perlsub .

Если подпрограмма экспортируется в ваше пространство имен, она должна быть определена.

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