我想用这样的perl脚本将输入提供给C程序 ./cprogram $(perl -e 'print "xabxcdxef";')
.
但是,必须从文件中读取字符串。所以我得到这样的东西: ./cprogram $(perl -e 'open FILE, "<myfile.txt"; $file_contents = do { local $/; <FILE> }; print $file_contents'
.但是,现在perl将字符串解释为字符串"xabxcdxef"
,我希望它将其解释为字节序列,如第一个示例所示。
如何实现这一点?它必须在没有File::Slurp的服务器上运行。
一种情况下,您将三个字节AB CD EF
(由字符串文字"xABxCDxEF"
生成)传递给print
。
在第二种情况下,您必须将这三个字节以外的内容传递给 print
.我怀疑您正在将十二个字符的字符串xABxCDxEF
传递给print
.
所以你的问题变成了:如何将十二个字符的字符串xABxCDxEF
转换为三个字节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
Perl 的评估是不是太邪恶了?如果没有,则以 print eval(""$file_contents"");
结尾
或者你可以使用 Perl 提前准备文件吗?EG print FILE "xABxCDxED";
然后使用现有代码读取生成的文件。
使用bash 技巧:
perl -e "$(echo "print "$(cat input)"")"
对于您的示例,它变为:
./cprogram "$(perl -e "$(echo "print "$(cat myfile.txt)"")")"