2016-05-15 4 views
2

私はperlスクリプトをPythonに変換していましたが、私は理解できないこの関数を発見しました。perl eval with back quote

sub set_xyz_hash { 
    %xyz =(); 
    $_ = join(' ', map { my $a = $_; $a =~ s/\'/\'\"\'\"\'/g; "'$a'" } @ARGV); 
    eval `XYZ_ARG0='$0' NZENV_OUTPUT='-a -p xyz' xyz $_`; 
} 

Perlでの私の知識は非常に限られているため、私は、この機能で使用される「evalの」をを理解することができませんでした。誰かが私をここで助けてくれますか?

注、evalはwth `(バッククォート)です。

+0

この文を評価する代わりに(またはそれに加えて)*** print ***を試してください。つまり、 'print 'XYZ_ARG0 =' $ 0 'NZENV_OUTPUT =' - a -p xyz 'xyz $ _' 、 "\ n"; '。実際に何が実行されるかを見ることができます。 'eval'はそのコマンドの出力をPerlコードとして実行します。 – PerlDuck

+1

実行されているコマンドを信頼する必要があります。これはいくつかの観点から非常に危険です。 –

答えて

1

バッククォートは、外部コマンドを実行し、出力を返す:それは基本的にの出力からいくつかのPerlソースをフェッチだ

my $result = `XYZ_ARG0='$0' NZENV_OUTPUT='-a -p xyz' xyz $_`; 
eval $result; 

my $result = `ls -l`; 
print $result; 

あなたevalラインがまったく同じように処理され、呼び出されたスクリプトを実行して実行します。

+0

私は答えとしてマークしています。この項目の最後の1つの疑問は、一重引用符で$ 0がバッククォート内でどのように動作するかです。 –

+0

あなたはコンパイラのような行を読んでいるはずです。*一重引用符で* $ 0はありません。他の文字と一緒にバッククォートに '$ 0'があります。バッククォート内の変数が置き換えられるので、$ 0は現在のプロセスのタイトルになります。 'print \' echo '$ 0' \ ';'を試してみてください。 'print'と' echo'は非常に強力なデバッグと学習ツールです:) – Sebastian