python
  • perl
  • eval
  • 2016-05-15 73 views 2 likes 
    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用於`(back quote)。

    +0

    嘗試首先***打印***語句,而不是(或除了)評估它,即'print'XYZ_ARG0 ='$ 0'NZENV_OUTPUT =' - a -p xyz'xyz $ _「 ,「\ n」;'。所以你可以看到實際執行的內容。 'eval'然後以Perl代碼的形式執行該命令的輸出。 – PerlDuck

    +1

    請注意,您必須信任運行的命令;從某些角度來看,這是非常危險的。 –

    回答

    1

    的反引號運行外部命令並返回輸出:

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

    eval線恰好處理相同的方式:

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

    它基本上取出由輸出一些Perl源程序被調用的腳本並運行它。

    +0

    我已經標記爲答案。關於這個項目的最後一個疑問是,單引號中的$ 0將如何在反引號內部表現? –

    +0

    你必須像編譯器那樣讀取行:單引號*中沒有* $ 0,反引號中有一個'$ 0'和其他一些字符。反引號中的變量被替換,因此$ 0將成爲當前進程標題。試試'print \'echo'$ 0'\';'。 'print'和'echo'是非常強大的調試和學習工具:) – Sebastian

    相關問題