我使用AnyEvent::DNS
模块。
我想禁用IPv6,因此解析器只会请求A
记录。
AnyEvent::DNS
,使用环境变量$ENV{PERL_ANYEVENT_PROTOCOLS}
但设置变量不起作用;解析程序仍然发送两个请求A
和AAAA
来自AnyEvent::DNS
的代码:
our %PROTOCOL; # (ipv4|ipv6) => (1|2), higher numbers are preferred
BEGIN {
...;
my $idx;
$PROTOCOL{$_} = ++$idx
for reverse split /\s*,\s*/,
$ENV{PERL_ANYEVENT_PROTOCOLS} || "ipv4,ipv6";
}
如何在加载模块之前定义环境变量?
答案 0 :(得分:4)
由于检查环境变量的代码位于BEGIN
块中,因此一旦Perl编译器到达它,它将立即运行。
当Perl开始编译脚本时,它首先检查use
语句。因此,当您use AnyEvent::DNS
时,Perl会加载该模块并解析该文件。 <{1}}块在该阶段执行,而方法中的代码只会被编译,而不会被执行。
因此,如果您有类似以下内容的内容,您在上面显示的代码将在您设置该变量之前运行。
BEGIN
有两种方法可以规避这一点。
在加载AnyEvent :: DNS之前,您可以将作业放在自己的use strict;
use warnings;
use AnyEvent::DNS;
$ENV{PERL_ANYEVENT_PROTOCOLS} = 'ipv4';
...
块中。这样它将首先设置。
BEGIN
或者,您可以使用为shell设置的环境变量调用您的程序。
use strict;
use warnings;
BEGIN {
$ENV{PERL_ANYEVENT_PROTOCOLS} = 'ipv4';
}
use AnyEvent::DNS;
第二个更便携,以防你以后想要它做IPv6。
详细了解perlmod中的$ PERL_ANYEVENT_PROTOCOLS=ipv4 perl resolver.pl
。