在PORT上使用PARSE!值

Hos*_*ork 3 file-io parsing rebol

我尝试在PORT上使用PARSE!它不起作用:

>> parse open %test-data.r [to end]  
** Script error: parse does not allow port! for its input argument
Run Code Online (Sandbox Code Playgroud)

当然,如果您阅读以下数据,它会起作用:

>> parse read open %test-data.r [to end]  
== true
Run Code Online (Sandbox Code Playgroud)

...但是在没有首先将它们加载到内存中的情况下,能够在大文件上使用PARSE似乎很有用.

有没有理由说PARSE 无法在PORT上工作!......还是仅仅没有实施?

mol*_*iad 6

简单的答案是不,我们不能......

解析的工作方式,它可能需要回滚到输入字符串的前一部分,当它满足流的最后一个字符时,实际上可能是完整输入的头部.

当端口从端口获取输入时,端口将其数据复制到字符串缓冲区,因此事实上,从来没有任何"先前"字符串可用于回滚.它就像量子物理学...只是看着它,它不再存在了.

但正如你所知道的那样......没有不是答案.;-)

这就是说,有一种方法可以解析来自端口的数据,但是需要更多的工作.

你要做的是使用缓冲区,和

APPEND buffer COPY/part connection amount
Run Code Online (Sandbox Code Playgroud)

根据您的数据,数量可以是1字节或1kb,使用有意义的.

将新输入添加到缓冲区后,解析它并添加逻辑以了解是否匹配了该缓冲区的一部分.

如果某些东西肯定匹配,你删除/分配从缓冲区匹配的内容,并继续解析直到没有解析.

然后重复上面直到你到达输入结束.

我在一个实时EDI tcp服务器中使用它,它有一个"永远在线"的tcp端口,以便分解(可能)连续的输入数据流,实际上是端到端地回送消息.

细节

设置此系统的最佳方法是使用/ no-wait和循环,直到端口关闭(您没有收到而不是"").

还要确保在解析时有一种方法可以检查数据完整性问题(例如跳过的字节或错误的消息),否则,您将永远无法达到目的.

在我的系统中,当缓冲液是超出特定大小,我试图其中跳过的字节,直到图案的替换规则可能被进一步发现往下流.如果找到一个,则记录错误,存储部分消息并为sysadmin引发警报以对消息进行排序.

HTH!