2011-05-09 57 views
5

間歇性錯誤。只會偶爾發生一次,但這個程序需要100%可靠。宕。printf的「只讀值的修改嘗試」錯誤

它可以正常打印到標準輸出。

我在做什麼錯? arrgh!

+2

當您打印到文件句柄時,爲什麼要從'print'更改爲'printf'? (另外,爲什麼你仍然使用全局'FILEHANDLE's而不是詞法作用域變量?) – 2011-05-09 11:19:47

+4

Chris說:D 從文檔:「__列表的第一個參數將被解釋爲printf格式[..] Don在簡單的打印過程中不會陷入使用printf的陷阱,打印效率更高,錯誤更少_「 – 2011-05-09 11:28:28

+0

很酷。謝謝。我以爲我不得不使用printf打印到FILEHANDLE。謝謝。 – jebediah 2011-05-11 04:41:23

回答

9

printf的第一個參數被解釋爲輸出格式,而不是輸出本身。有關詳細信息,請參見perldoc -f printfman 3 printf

的問題是,printf有時可能會嘗試寫入其ARGS (這甚至已經進行了幾個漏洞的源C programs,例如:

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

正如你可以看到,該套$_爲3,這是發生在%n之前的字符數。嘗試%n沒有進一步的參數,你會看到來自OP的確切的錯誤消息。

長話短說:使用print除非你真的需要高級格式。除非您確實需要更高級的格式,否則請將第一個參數保留爲printf r/o。

+0

謝謝。然後我會使用打印。 – jebediah 2011-05-11 04:42:46

2

您將需要檢查stdout的失敗。我的猜測是,偶爾,$ response {_content}包含對printf有特殊含義的序列。

1

我只是有相同的錯誤消息,也與printf的,但我這樣做:從博客

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

值有時包含十六進制編碼數據。除了與「X」運營商做填充,我發現,所獲得的價值出來的格式字符串還曾:

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

我想在格式字符串問題可能是由於百分比(%)被解釋爲一個格式化的值,但與&符號(&)擺弄使錯誤消失。無論如何,現在插入一個將被解釋的值似乎是需要避免的。