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

时间:2017-05-02 20:01:31

标签: perl anyevent

我使用AnyEvent::DNS模块。

我想禁用IPv6,因此解析器只会请求A记录。

AnyEvent::DNS,使用环境变量$ENV{PERL_ANYEVENT_PROTOCOLS}

但设置变量不起作用;解析程序仍然发送两个请求AAAAA

来自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";
}

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

1 个答案:

答案 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