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")传递给print.

在第二种情况下,您必须将除这三个字节之外的其他内容传递给print. 我怀疑您将十二个字符串传递\xAB\xCD\xEFprint.

所以你的问题变成了:如何将十二个字符的字符串\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

它在这里起作用:

$ 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 回答