printf“尝试修改只读值”错误

时间:2011-05-09 10:55:45

标签: perl printf

尝试按以下方式打印对象时:

print "$response{_content} \n";
printf OUTPUT "$response{_content} \n"; 

printf语句生成错误“尝试修改只读值”

这是间歇性的错误。只会偶尔发生一次,但这个程序需要100%可靠。荡。

它可以打印到STDOUT。

我做错了什么? arrgh!

3 个答案:

答案 0 :(得分:9)

printf的第一个参数被解释为输出格式,而不是输出本身。有关详细信息,请参阅perldoc -f printfman 3 printf

问题是,printf偶尔会尝试写入其args (这甚至是C programs中的多个漏洞的来源,例如:

perl -we 'printf "abc%n\n", $_; print "$_\n";'

如您所见,这会将$_设置为3,这是%n发生之前写入的字符数。尝试%n没有进一步的args,你会看到OP的确切错误信息。

长话短说:除非您确实需要高级格式,否则请使用print。保留printf r / o的第一个参数,除非你真的需要更高级的格式化。

答案 1 :(得分:2)

您需要检查stdout是否有故障。我的猜测是,偶尔,$ response {_content}包含对printf有特殊含义的序列。

答案 2 :(得分:1)

我刚刚收到了与printf相同的错误消息,但我这样做了:

printf "%-10s $value\n", $label;

该值有时包含来自博客的十六进制编码数据。除了使用“x”运算符进行填充之外,我发现从格式字符串中获取值也有效:

printf "%-10s %s\n", $label, $value;

我认为格式字符串中的问题可能是由于百分比(%)被解释为格式化值,但摆弄&符号(&)会使错误消失。无论如何,插入一个现在将被解释的值似乎是要避免的。