2011-04-08 16 views
0

我試圖解析通過HTTP查詢的結果,最終可能返回數百萬行 - 每行需要解析。理想情況下,我希望從連接中一次讀取一行,並在我去時解析它 - 這基本上是一個FileHandle-esque迭代器,但現有的HTTP庫似乎都一次獲取所有內容,儘管可以a)保存到一個文件,或b)使用代碼ref處理塊。 A並不理想,因爲它是一種雙通解決方案(在傳輸數據後需要逐行讀取文件,並且可能不必要地佔用存儲空間)。 B是不理想的,因爲希望能夠返回每一行,而不是在代碼引用中處理它,而且塊不是行,所以LWP解決方案不會從LWP行重構中受益。我知道有非阻塞解決方案(使用AnyEvent和Coro),但這些解決方案似乎對非阻塞性更感興趣,而不是逐行處理。任何人都可以在這裏指出一個好的方向,還是我在錯誤的樹上咆哮?Perl中是否有任何HTTP連接迭代器?

回答

0

回調讓你可以做任何你想做的事情。你可以做到這一點,所以你緩衝輸入,並從緩衝區中讀取行。 Perl允許你打開任何文件句柄(使用tie),包括字符串(使用open)。無論如何,你可能發現的任何事情最終都會得到一塊,並將其變成線。

+0

感謝您的回覆 - 關於從回調中輸入緩衝區並從存取器讀出緩衝區的策略,什麼是停止這i)如果處理速度慢於讀取連接時消耗大量內存ii)錯誤地返回空行/如果解析超前於連接讀取,則顯示已達到緩衝區末尾? – flightlessbird 2011-04-12 10:33:25

+0

@flesslessbird:i)什麼也沒有,但除了最複雜的處理之外,這是極其不可能的,因爲CPU比網絡通信要快幾個數量級。 ii)除非你編寫了你自己的緩衝區處理代碼,並且做得不正確,否則當緩衝區爲空而不是返回空行或EOF時,從緩衝區讀取將會被阻塞。 – 2011-04-12 15:32:28

+0

感謝您提供豐富的回覆@Dave。因此,回顧一下,最好的方法是追加到一個sting緩衝區,這個sting緩衝區被打開到一個文件句柄進行讀取 - 每條讀取線都會阻塞,直到數據從連接追加到它。這應該工作得很好。 – flightlessbird 2011-04-13 17:15:20

相關問題