2017-05-02 9 views
1

私はAnyEvent::DNSモジュールを使用しています。モジュールをロードする前に環境変数を定義する方法は?

IPv6を無効にして、リゾルバがAレコードのみを要求するようにしたいとします。

AnyEvent::DNS

は、 $ENV{PERL_ANYEVENT_PROTOCOLS}

しかし、変数を設定すると動作しない変数環境を使用しています。モジュールをロードする前に環境変数を定義する方法

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

:リゾルバはまだ2つの要求AAAAA

AnyEvent::DNSからコードを送信しますか?

+1

これは 'BEGIN'ブロックでそれを使用しています。おそらくこのコードを持つモジュールを'使用する 'でしょう。その部分と '$ ENV {..} 'の設定方法を正確に示してください。 – simbabque

答えて

4

環境変数をチェックするコードはBEGINブロックにあるので、Perlコンパイラがそれに達すると直ちに実行されます。

Perlがスクリプトのコンパイルを開始すると、まずuse文がチェックされます。あなたがuse AnyEvent::DNSのとき、Perlはそのモジュールを読み込み、ファイルを解析します。 BEGINブロックがその段階で実行され、メソッドのコードはコンパイルされ、実行されません。

もしあなたが次のようなものを持っているならば、上に示したコードは、その変数を設定する前に実行されます。

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

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

これを回避するには2通りの方法があります。

AnyEvent :: DNSをロードする前に、割り当てを自分自身のBEGINブロックに入れることができます。そうすれば、それが最初に設定されます。

use strict; 
use warnings; 

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

use AnyEvent::DNS; 

また、シェルから環境変数を設定してプログラムを呼び出すこともできます。

後でIPv6をやりたい場合は、2番目の方が移植性が高いです。

BEGINについては、perlmodをご覧ください。

+1

本当にありがとう! – Dmitry

+0

@ドミトリーあなたは大歓迎です。 'BEGIN'に慣れていない場合は、リンクしているドキュメントをチェックしてください。これはPerlの奇妙なものの簡単な部分の1つです。 :) – simbabque

+0

@HunterMcMillenええ、私は質問でダブルクリックしたと思います。ありがとう。あなたがそれを見たときに、私の投稿にそのようなタイプミスを修正するように気軽に。 :) – simbabque

関連する問題