2010-11-08 41 views
3

我試過在PORT上使用PARSE!它不工作:在PORT上使用PARSE!值

>> parse open %test-data.r [to end] 
** Script error: parse does not allow port! for its input argument 

當然,如果您在讀取數據它的工作原理:

>> parse read open %test-data.r [to end] 
== true 

...但它似乎能夠在大量使用解析它是有用的沒有先將它們加載到內存中的文件。

是否有一個原因爲什麼PARSE 不能工作在一個端口! ...還是隻是沒有實現?

+0

也許你應該在CureCode數據庫中添加一個心願:http://curecode.org/rebol3/ – Oldes 2010-11-27 11:22:29

回答

6

簡單的答案是沒有我們做不到的......

的方式解析工作,它可能需要回滾到輸入字符串的一部分之前,它實際上可能是頭當它滿足流的最後一個字符時,完整輸入。

端口將數據複製到字符串緩衝區,因爲他們從端口獲取輸入,所以事實上,從來沒有任何「先前」字符串用於解析回滾到。它就像量子物理學......只是看着它,它不在那裏了。

但是正如你所知道的那樣......不,不是一個答案。 ;-)

這就是說,有一種方法來解析數據端口作爲它被抓住,但它的一點點工作。

你要做的就是用一個緩衝區,

APPEND buffer COPY/part connection amount 

根據您的數據量可能是1個字節或1KB,使用情理之中的事情。

一旦新的輸入被添加到您的緩衝區,解析它並添加邏輯知道您是否匹配該緩衝區的部分

如果某些東西正確匹配,則刪除/分配與緩衝區匹配的內容,然後繼續解析,直到解析爲止。

然後重複上述步驟直到輸入結束。

我已經在一個實時的EDI tcp服務器中使用這個服務器,它有一個「永遠在線」的tcp端口,以分解一個(可能)連續的輸入數據流,它實際上將端到端的信息捎帶回。

細節

設置的最佳方式本系統是使用/無等待和循環,直到端口關閉(你收到沒有,而不是「」)。

還要確保在解析時你有辦法檢查數據完整性問題(如跳過的字節或錯誤的消息),否則,您將永遠不會到達最後。

在我的系統中,當緩衝區超過了特定的大小時,我嘗試了一個替代規則,它跳過了字節,直到模式的可能在該流的更下方找到。如果找到了一個,則會記錄一個錯誤,存儲部分消息併爲系統管理員提出警報以整理消息。

HTH!

+1

我不知道很多關於PORT !計劃和我的大多數Rebol修補到目前爲止不必擔心。但HEAD似乎在PORT工作!在R3中,例如...不會回滾地址嗎? – HostileFork 2010-11-09 03:34:49

3

我認爲馬克西姆的答案足夠好。此時端口上的解析沒有執行。我認爲以後不可能實施,但我們必須首先解決其他問題。

也如Maxim所說,即使現在你也可以這樣做,但這取決於你想要做什麼。

當然,您可以解析大文件而無需完全讀取到內存中。總是很高興知道,你期望解析什麼。例如,所有大文件(如音樂和視頻文件)都被分成多個塊,因此您可以使用copy來獲取這些塊並解析它們。

或者如果您只想讀取多個網頁的標題,那麼您可以先讀取1024字節的字節,然後查看標題標籤,如果失敗,請閱讀更多字節並再次嘗試......

這正是我們必須要做的,以便無論如何都允許本地解析端口。

並隨時在CureCode數據庫中添加一個心願:http://curecode.org/rebol3/

+1

我會這麼說,有些(但不是全部)端口提供了SEEK工具,因此在技術上解析可能會在這些端口上提供完整的功能,但它尚未實現...... – HostileFork 2010-11-27 20:11:47