5

このような perl スクリプトを使用して、C プログラムに入力を送りたいと考えています ./cprogram $(perl -e 'print "\xab\xcd\xef";')

ただし、文字列はファイルから読み取る必要があります。だから私はこのようなものを得る: ./cprogram $(perl -e 'open FILE, "<myfile.txt"; $file_contents = do { local $/; <FILE> }; print $file_contents'. ただし、perl は string を string として"\xab\xcd\xef"解釈するようになり、最初の例のようにバイト シーケンスとして解釈するようにします。

これはどのように達成できますか?File::Slurp のないサーバーで実行する必要があります。

4

3 に答える 3

6

AB CD EF最初のケースでは、 (文字列リテラルによって生成された"\xAB\xCD\xEF") 3 バイトを に渡しますprint

2 番目のケースでは、これらの 3 バイト以外のものを に渡す必要がありますprint\xAB\xCD\xEFに 12 文字の文字列を渡していると思われますprint

\xAB\xCD\xEFしたがって、あなたの質問は次のようになります。12 文字の文字列を 3 バイトに変換するにはどうすればよいですかAB CD EF。まあ、あなたは次のようなある種のパーサーを必要とするでしょう

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

そして、ここにそれが働いています:

$ 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
于 2012-12-14T02:17:40.130 に答える
0

bash トリックを使用する:

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

あなたの例では次のようになります。

./cprogram "$(perl -e "$(echo "print \"$(cat myfile.txt)"\")")"
于 2012-12-14T02:32:58.820 に答える
0

Perlのevalが悪すぎる?そうでない場合は終了print eval("\"$file_contents\"");

または、Perl を使用して事前にファイルを準備できますか? EGprint FILE "\xAB\xCD\xED";次に、結果のファイルを既存のコードで読み取ります。

于 2012-12-14T03:29:16.417 に答える