尝试按以下方式打印对象时:
print "$response{_content} \n";
printf OUTPUT "$response{_content} \n";
printf语句生成错误“尝试修改只读值”
这是间歇性的错误。只会偶尔发生一次,但这个程序需要100%可靠。荡。
它可以打印到STDOUT。
我做错了什么? arrgh!
答案 0 :(得分:9)
printf
的第一个参数被解释为输出格式,而不是输出本身。有关详细信息,请参阅perldoc -f printf和man 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;
我认为格式字符串中的问题可能是由于百分比(%)被解释为格式化值,但摆弄&符号(&)会使错误消失。无论如何,插入一个现在将被解释的值似乎是要避免的。