我怎样才能让perl解释代表地址的字符串变量

时间:2012-12-14 01:53:54

标签: perl

我想用这样的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的服务器上运行。

3 个答案:

答案 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";然后用现有代码读取生成的文件。