1

我使用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";
}

如何在加载模块之前定义环境变量?

4

1 回答 1

4

由于检查环境变量的代码在一个BEGIN块中,一旦 Perl 编译器到达它就会立即运行。

当 Perl 开始编译你的脚本时,它首先检查use语句。因此,当您使用 时use AnyEvent::DNS,Perl 会加载该模块并解析文件。BEGIN块在那个阶段执行,而方法中的代码只会被编译,不会被执行。

因此,如果您有类似以下的内容,那么您上面显示的代码将在您设置该变量之前运行。

use strict;
use warnings;
use AnyEvent::DNS;

$ENV{PERL_ANYEVENT_PROTOCOLS} = 'ipv4';
...

有两种方法可以绕过它。

BEGIN在加载 AnyEvent::DNS 之前,您可以将分配放在您自己的块中。这样它将首先设置。

use strict;
use warnings;

BEGIN {
    $ENV{PERL_ANYEVENT_PROTOCOLS} = 'ipv4';
}

use AnyEvent::DNS;

或者,您可以在 shell 中使用为其设置的环境变量来调用您的程序。

$ PERL_ANYEVENT_PROTOCOLS=ipv4 perl resolver.pl

第二个更便携,以防您以后希望它执行 IPv6。

BEGINperlmod中阅读更多信息。

于 2017-05-02T20:21:11.967 回答