我想用这样的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将字符串解释为字符串"\xab\xcd\xef"
,我希望它将其解释为第一个示例中的字节序列。
如何实现这一目标?它必须在没有File :: Slurp的服务器上运行。
答案 0 :(得分:5)
在第一种情况下,您将三个字节AB CD EF
(由字符串文字"\xAB\xCD\xEF"
生成)传递给print
。
在第二种情况下,您必须将除这三个字节之外的内容传递给print
。我怀疑你将十二个字符串\xAB\xCD\xEF
传递给print
。
所以你的问题变成了:如何将十二个字符的字符串\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
答案 1 :(得分:0)
使用bash技巧:
perl -e "$(echo "print \"$(cat input)"\")"
对于你的例子来说:
./cprogram "$(perl -e "$(echo "print \"$(cat myfile.txt)"\")")"
答案 2 :(得分:0)
Perl的评价太邪恶吗?如果没有,请以print eval("\"$file_contents\"");
或者您可以使用Perl提前准备文件吗? EG print FILE "\xAB\xCD\xED";
然后用现有代码读取生成的文件。