2012-12-14 61 views
5

我想用這樣的perl腳本將輸入提供給C程序 ./cprogram $(perl -e 'print "\xab\xcd\xef";')我該如何讓Perl解釋一個代表地址的字符串變量

但是,必須從文件中讀取字符串。所以我得到這樣的東西: ./cprogram $(perl -e 'open FILE, "<myfile.txt"; $file_contents = do { local $/; <FILE> }; print $file_contents'。但是,現在perl將該字符串解釋爲字符串"\xab\xcd\xef",我希望它將它解釋爲字節序列,如第一個示例中所示。

這是如何實現的?它必須在沒有File :: Slurp的服務器上運行。

回答

5

在第一種情況下,您將三個字節AB CD EF(由字符串文字"\xAB\xCD\xEF"生成)傳遞給print

在第二種情況下,您必須將除這三個字節以外的內容傳遞給print。我懷疑你通過了12個字符串\xAB\xCD\xEFprint

因此,您的問題變成:如何將12個字符的字符串\xAB\xCD\xEF轉換爲三個字節AB CD EF。那麼,你會需要某種解析器等作爲

s/\\x([0-9a-fA-F][0-9a-fA-F])|\\([^x])|([^\\]+)/ 
    $1 ? chr(hex($1)) : $2 ? $2 : $3 
/eg 

這裏,它是在工作中:使用bash的伎倆

$ perl -e'print "\\xAB\\xCD\\xEF";' >file 

$ echo -n "$(perl -0777pe' 
    s{\\x([0-9a-fA-F][0-9a-fA-F])|\\([^x])|([^\\]+)}{ 
     $1 ? chr(hex($1)) : $2 // $3 
    }eg; 
    ' file)" | od -t x1 
0000000 ab cd ef 
0000003 
+0

對不起,NUL字節只是我輸入有史以來最愚蠢的例子字符串。在我的實際情況下,沒有NUL字節。 – codd

+0

@codd,我從你的問題中刪除了NUL,並從我的答案中刪除了相應的評論。我也充實了我的解釋。 – ikegami

+0

對不起,遲到接受,完全忘了它。 – codd

0

perl -e "$(echo "print \"$(cat input)"\")" 

這對於你的榜樣變得:

./cprogram "$(perl -e "$(echo "print \"$(cat myfile.txt)"\")")" 
+0

...哇,我只注意到你期望整個文件是十六進制轉義?如果是這樣的話,我以前的評論不適用,但我覺得很難相信是這樣。 – ikegami

+1

更簡單? './cprogram「$(perl -0777pe'$ _ = eval qq {」$ _「}; $ @ if $ @'myfile.txt)」' – ikegami

0

Perl's eval too e VIL?如果沒有,結束於print eval("\"$file_contents\"");

或者你可以使用Perl預先準備文件嗎? EG print FILE "\xAB\xCD\xED";然後用您現有的代碼讀取生成的文件。

相關問題