2010-02-07 34 views
4

我正在使用Perl檢查各種套接字選項的存在和默認值。在Perl中,如何檢查Socket選項的存在而不產生警告?

#!/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

有沒有辦法做到這一點,而不在輸出端產生的警告?

回答

1

問子是否已被定義,而不是是否表達式的值定義:

if (defined &SO_REUSEPORT) { ... } 

documentation for defined解釋:

您可能也使用defined(&func)來檢查子程序&func是否曾被定義過。返回值不受任何前向聲明&func的影響。請注意,未定義的子程序仍然可以被調用:其程序包可能有一個AUTOLOAD方法,使其在第一次被調用時彈出 - 參見perlsub

如果將sub導出到您的名稱空間中,則必須對其進行定義。

+0

你爲什麼要檢查子程序定義?這些實際上在Socket.pm中定義爲子例程而不是常量? – 2010-02-09 18:16:22

+0

@Robert常量*是* subs!見http://perldoc.perl.org/perlsub.html#Constant-函數 – 2010-02-09 18:48:38

+0

你的回答比我最初選擇的回答要好。 – 2010-02-10 18:31:48

9

該消息來自Socket.pm中的AUTOLOAD。當它找到一個不被支持的常量時,它就是croak s。您可以趕上與eval

use Socket; 

if(defined eval { SO_REUSEPORT }) { 
     ...; 
     } 
相關問題