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可以在这些端口上提供完整的功能,只是还没有实现。。。