Это является продолжением моего предыдущего вопроса:Perl: Проверка существования параметров сокета
In Perl, how can I check for the existence of Socket options without generating warnings?
Если я запускаю следующий код я получить результат я ожидаю:
#!/usr/bin/perl -w
use strict;
use diagnostics;
use Socket qw(:all);
my %opts;
if (defined(eval { SO_REUSEPORT })) {
$opts{'SO_REUSEPORT'}
= {opt_level =>SOL_SOCKET,opt_name=>SO_REUSEPORT,opt_print=>\&sock_str_flag};
} else {
print "SO_REUSEPORT undefined\n";
$opts{'SO_REUSEPORT'}
= {opt_level =>0,opt_name=>0,opt_print=>undef};
}
=head
# IPV6 options
if (defined(eval { IPV6_DONTFRAG })) {
$opts{'IPV6_DONTFRAG'}
= {opt_level =>IPPROTO_IPV6,opt_name=>IPV6_DONTFRAG,opt_print=>\&sock_str_flag};
} else {
print "IPV6_DONTFRAG undefined\n";
$opts{'IPV6_DONTFRAG'}
= {opt_level =>0,opt_name=>0,opt_print=>undef};
}
=cut
Он выводит:
[email protected]$ ./test.pl
SO_REUSEPORT undefined
Но если я раскомментирую блок для IPV6_DONTFRAG
я получаю:
Bareword "IPV6_DONTFRAG" not allowed while "strict subs" in use at ./test.pl line 17.
Bareword "IPV6_DONTFRAG" not allowed while "strict subs" in use at ./test.pl line 17.
Почему один неопределенный bareword заставляя его блевать, а другие нет? И как может распространяться ошибка из блока eval { }
?
Редактировать
По-видимому, SO_REUSEPORT
экспортируется Socket.pm каким-то образом, как это в массиве @EXPORT. Таким образом, очевидно, что он определен, но с его помощью выдается ошибка, которую ловит eval.
Это еще не объясняет, что происходит с IPV6_DONTFRAG
. Я полагаю, я должен был бы определить это сам, а затем просто позвонить getsockopt
, чтобы проверить, если она поддерживается ...
Почему кто-то отметил это? –