-4

環境変数を評価し、結果を変数に設定したいと思います。

$x=eval($ENV{EDITOR});
print $x;

出力:

/bin/vi

正常に動作します。

環境変数QUOTEを\'に設定して、同じことを試してみると、次のようになります。

$x=eval($ENV{QUOTE});
print $x;

出力:

(なし)

$@ set to: "Can't find a string terminator anywhere before ..."

evalはスクリプトを呼び出して最後の値を返すためにも使用されるため(非常に便利)、単純に設定したくない$x=$ENV{QUOTE};ので、eval()を使い続けたいと思います。この方法で評価されたすべての環境変数は、私が別の場所に設定しているため、この方法で評価された環境変数への悪意のあるアクセスについては心配していません。

提案?

4

6 に答える 6

13

もちろん、何もしません。

ENV 変数に半分コードであるがそうではないテキストが含まれていて、結果の文字列をそのコードを Perl として評価するものに与える場合、もちろんそれは機能しません。

次の 3 つのオプションしかありません。

  1. 文字列をプログラムで処理して、無効な構文が含まれないようにする
  2. ENV 変数がごみではないことを手動で確認する
  3. evalを含まないが、正しい結果が得られるソリューションを見つけてください。

あなたはそれを不平を言うかもしれません

 $x = ' 

それは本質的に起こっていることであるため、有効なコードではありません。

「QUOTE」の値が機能するように修正するサンプル

# Bad. 
QUOTE="'" perl -wWe 'print eval $ENV{QUOTE}; print "$@"'
#  Can't find string terminator "'" anywhere before EOF at (eval 1) line 1.

# Bad. 
QUOTE="\'" perl -wWe 'print eval $ENV{QUOTE}; print "$@"'
#  Can't find string terminator "'" anywhere before EOF at (eval 1) line 1.

# Bad. 
QUOTE="\\'" perl -wWe 'print eval $ENV{QUOTE}; print "$@"'
#  Can't find string terminator "'" anywhere before EOF at (eval 1) line 1.

# Good
QUOTE="'\''" perl -wWe 'print eval $ENV{QUOTE}; print "$@"' 
# '
于 2009-03-19T12:45:02.340 に答える
10

evalそもそもなんでイジるの?言うべきか

my $x = $ENV{QUOTE};
print "$x\n";

は、Perl コードであるかのようevalに文字列を実行していますが、そうでないことを願っています。$ENV{QUOTE}そのため、\ が消えます。変数をチェックすると、次の$@ようなエラー メッセージが表示されます。

(eval 1) 行 2、EOF の構文エラー

Perl が実行するコードを環境変数に含める場合は、Safeモジュールを調べる必要があります。で実行できるコードの種類を制御できるため、eval誤って次のようなものを実行してしまうことはありません。"use File::Find; find sub{unlink $File::Find::file}, '.'"

于 2009-03-19T15:06:33.077 に答える
1

たぶんあなたが望むのはPerlのものではなく、シェルがするようevalに環境変数を評価することです。このために、バックティックを使用します。

$x = `$ENV{QUOTE}`
于 2009-03-19T19:58:09.467 に答える
1

QUOTE がedになることがわかっているので、QUOTE の値を二重にエスケープすることもできます。eval

于 2009-03-19T12:41:27.637 に答える