我正在使用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
有没有办法在输出中不生成警告的情况下执行此操作?
答案 0 :(得分:9)
该消息来自Socket.pm中的AUTOLOAD
。当它找到不受支持的常量时,它为croak
s。你可以用eval:
use Socket;
if( defined eval { SO_REUSEPORT } ) {
...;
}
答案 1 :(得分:1)
询问是否已定义sub,而不是是否定义了表达式的值:
if (defined &SO_REUSEPORT) { ... }
您也可以使用
defined(&func)
检查是否已定义子例程&func
。返回值不受&func
的任何前向声明的影响。请注意,未定义的子例程可能仍然是可调用的:它的包可能有一个AUTOLOAD
方法,使其在第一次被调用时就会存在 - 请参阅perlsub。
如果将子导出到您的命名空间,则必须对其进行定义。