1

方法 1:

$C_HOME = "$ENV{EO_HOME}\\common\\";
print $C_HOME;

C:\work\System11R1\common\ を与える

つまり、環境変数が拡張されています。

方法 2:

C_HOME = $ENV{EO_HOME}\common\ を持つプロパティ ファイルを解析します

while(<IN>) {
    if(m/(.*)\s+=\s+(.*)/)
    {
        $o{$1}=$2;
    }
}

$C_HOME = $o{"C_HOME"};
print $C_HOME;

これにより、 $ENV{EO_HOME}\common\ の出力が得られます

つまり、環境変数が展開されていません。

2番目のケースでも環境変数が展開されるようにするにはどうすればよいですか。

4

4 に答える 4

7

問題は次の行にあります。

    $o{$1}=$2;

もちろん、perl は$2それを読んでも自動的に評価しません。

必要に応じて、手動で評価できます。

    $o{$1}=eval($2);

ただし、セキュリティの観点から問題がないことを確認する必要があります。

于 2012-07-24T12:58:40.357 に答える
3

の値に$o{C_HOME}はリテラル文字列が含まれます$ENV{C_HOME}\common\。評価された $ENV-value を取得するには、eval...を使用します。

$C_HOME = eval $o{"C_HOME"};

しかし、なぜそれが失敗するのかを見つけるのはあなたに任せます...

于 2012-07-24T12:59:59.733 に答える
1

式を評価する必要があります:

$C_HOME = eval($o{"C_HOME"});
于 2012-07-24T12:56:22.617 に答える
0

Perl は、 dataではなく、二重引用符のようなコード文字列で変数を展開します。

文字列内の変数を明示的に補間する必要がありますevalが、渡す対象を確認せずにそうするのevalは危険です。

代わりに、文字列内で補間したいすべてのものを探し、/ee修飾子による正規表現置換を使用してそれらを評価します。

このプログラムは、構成値内のハッシュの要素へのすべての参照を探し、%ENVそれらを置き換えます。Perl で許可されている場所ならどこでも空白のサポートを追加したいかもしれません ($ ENV { EO_HOME }問題なくコンパイルされます)。%ENVまた、削除する必要があるテスト値も割り当てます。

use strict;
use warnings;

my %data;

%ENV = ( EO_HOME => 'C:\work\System11R1' );

while (<DATA>) {
    if ( my ($key, $val) = m/ (.*) \s+ = \s* (.*) /x ) {
        $val =~ s/ ( \$ENV \{ \w+ \} ) / $1 /gxee;
        $data{$key} = $val;
    }
}

print $data{C_HOME};


__DATA__
C_HOME = $ENV{EO_HOME}\common\

出力

C:\work\System11R1\common\
于 2012-07-24T16:48:30.073 に答える