代码之家  ›  专栏  ›  技术社区  ›  HostileFork says dont trust SE

在端口上使用parse!价值

  •  3
  • HostileFork says dont trust SE  · 技术社区  · 14 年前

    我尝试在端口上使用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而不首先将它们加载到内存中,这似乎很有用。

    有没有理由分析 不能 在港口工作!…或者只是还没有实现?

    2 回复  |  直到 14 年前
        1
  •  6
  •   moliad    14 年前

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

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

    端口在从端口获取输入时将其数据复制到字符串缓冲区,因此事实上,没有任何“优先”字符串可供分析回滚到。就像量子物理学…只是看着它,它不再存在了。

    但正如你在篮板上所知道的…不不是答案。;-)

    也就是说,有一种方法可以解析数据 一个港口,因为它被抓住,但它有点工作。

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

    APPEND buffer COPY/part connection amount
    

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

    一旦新的输入被添加到缓冲区中,分析它并添加逻辑以确定是否匹配 部分 在那个缓冲区。

    如果有匹配的内容,则从缓冲区中删除/部分匹配的内容,并继续解析,直到没有解析为止。

    然后重复以上操作,直到输入结束。

    我在一个具有“始终开启”TCP端口的实时edi tcp服务器中使用了它,以便分解(可能)连续的输入数据流,而这实际上是端到端的piggy备份消息。

    细节

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

    另外,请确保在分析时有一种检查数据完整性问题的方法(如跳过的字节或错误的消息),否则,您将 从未 到达终点。

    在我的系统中,当缓冲区超过特定的大小时,我尝试了一个替代规则,它跳过字节,直到一个模式 可以 在小溪的下游。如果找到了一条,则会记录一个错误,存储部分消息并发出警报,以便系统管理员对消息进行排序。

    嗯!

        2
  •  3
  •   Oldes    14 年前

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

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

    当然,您可以解析大型文件,而无需将它们完全读取到内存中。知道你想要解析的内容总是很好的。例如,所有大文件(如音乐和视频文件)都被划分为块,因此您可以使用copy seek获取这些块并对其进行解析。

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

    这正是允许本地解析端口所必须做的。

    在curecode数据库中添加一个愿望: http://curecode.org/rebol3/