在Perl中,如何在不生成警告的情况下检查Socket选项的存在?

时间:2010-02-07 10:08:59

标签: perl sockets network-programming

我正在使用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 个答案:

答案 0 :(得分:9)

该消息来自Socket.pm中的AUTOLOAD。当它找到不受支持的常量时,它为croak s。你可以用eval

来捕获它
 use Socket;

 if( defined eval { SO_REUSEPORT } ) {
      ...;
      }

答案 1 :(得分:1)

询问是否已定义sub,而不是是否定义了表达式的值:

if (defined &SO_REUSEPORT) { ... }

documentation for defined解释说:

  

您也可以使用defined(&func)检查是否已定义子例程&func。返回值不受&func的任何前向声明的影响。请注意,未定义的子例程可能仍然是可调用的:它的包可能有一个AUTOLOAD方法,使其在第一次被调用时就会存在 - 请参阅perlsub

如果将子导出到您的命名空间,则必须对其进行定义。