Parsing 在端口上使用解析!价值

Parsing 在端口上使用解析!价值,parsing,file-io,rebol,Parsing,File Io,Rebol,我尝试在端口上使用解析!而且它不起作用: >> 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 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
…但如果能够在不首先将大型文件加载到内存的情况下对其进行解析,似乎会很有用


解析无法在端口上工作有什么原因吗。。。还是只是还没有实施?

简单的答案是不,我们不能…。

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

端口从端口获取输入时,会将数据复制到字符串缓冲区,因此事实上,从来没有任何“previor”字符串可用于回滚解析。就像量子物理一样。。。只是看着它,它已经不在了

但正如你在rebol中所知道的那样。。。“不”不是答案

也就是说,有一种方法可以在抓取端口时解析端口中的数据,但需要做更多的工作

你要做的是使用一个缓冲区

APPEND buffer COPY/part connection amount
根据您的数据,数据量可能是1字节或1kb,请使用有意义的数据

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

如果某个内容正匹配,则从缓冲区中删除/分割匹配的内容,并继续解析,直到没有任何内容解析

然后重复上述步骤,直到输入结束

我在一个实时EDI tcp服务器中使用了它,该服务器有一个“始终打开”的tcp端口,以便分解(可能)连续的输入数据流,这些数据流实际上是端到端地传递消息

详细信息

设置此系统的最佳方法是使用/no wait and loop,直到端口关闭(您收到的不是“”,而是“无”)

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

在我的系统中,当缓冲区超过特定大小时,我尝试了一个替代规则,该规则跳过字节,直到在流的下游找到模式为止。如果找到一个,则会记录一个错误,存储部分消息,并发出警报,供sysadmin整理消息


我认为马克西姆的答案足够好了。此时未实现对端口的解析。我不认为以后不可能实施,但我们必须先解决其他问题

正如马克西姆所说,即使现在你也能做到,但这取决于你到底想做什么

当然,您可以解析大文件,而无需将它们完全读入内存。知道您希望解析什么总是件好事。例如,所有大型文件,如音乐和视频文件,都被划分为块,因此您可以使用copy | seek获取这些块并解析它们

或者,如果您只想获取多个网页的标题,您可以只读取,比方说,前1024个字节并在此处查找标题标记,如果失败,请读取更多字节并重试

无论如何,这正是允许对端口进行本地解析所必须做的


还可以在CureCode数据库中随意添加一个愿望:

我对PORT不太了解!到目前为止,我的计划和大部分Rebol修补都不必担心它。但头似乎在港口工作!例如,在R3中。。。这不是解决回滚问题吗?也许你应该在CureCode数据库中添加一个愿望:我认为这一切都是说一些(但不是所有)端口提供查找功能,因此从技术上讲,parse可以在这些端口上提供完整的功能,只是还没有实现。。。