这是我的前一个问题的延续:的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.
为什么一个未定义的裸字使其BARF和其他不?那么错误如何传播出eval { }
块?
编辑
显然,SO_REUSEPORT
由Socket.pm以某种方式,因为它是@EXPORT阵列中导出。所以显然它已被定义,但使用它会引发eval捕获的错误。
这仍然不能解释IPV6_DONTFRAG
是怎么回事。我想我需要定义它自己,然后就打电话getsockopt
,以检查它是否支持...
为什么有人标记这个? – 2010-02-13 22:04:28