1

对于我的工作,我有时必须处理来自二进制协议的日志文件(日志文件包含消息的十六进制转储)。我想编写一个 Perl 脚本,它可以为我解释二进制数据并以更友好的格式打印内容。

我有一个专有格式的协议消息的(机器可读)描述,并且我(大部分)弄清楚了如何解析该格式(我无法完全理解的部分与我的目标无关,所以我可以忽略它们),因此我可以将描述转换为数据结构以在我的脚本中使用。

因为协议描述很少改变,每次我想分析一个日志文件时重新解析协议描述似乎是一种浪费,但另一方面,如果描述确实改变了,或者我不小心丢弃了我的预解析表单描述,那么我希望我的脚本自动触发对描述的重新解析。
实现这一点的最佳方法是什么?

4

2 回答 2

1

假设协议描述存在于脚本可访问的文件中,则具有读取解析数据的功能,该功能将解析结果缓存在中间文件中。逻辑非常简单,但步骤看起来非常冗长,因为我试图写出完整的规范 - 实际上它应该需要不到 10 行 Perl 代码。

  1. 检查中间文件是否存在。如果没有(或无法读取),请跳至专有解析步骤(#4)

  2. 如果您可以读取中间缓存文件,请读取“协议描述时间戳”字段(如下所述)。然后通过比较找出“协议描述”文件的修改时间stat()。如果“协议描述”文件的修改时间 >= 缓存文件的存储时间戳,则跳到专有解析步骤(#4)

  3. 否则(例如“协议描述”文件的时间是<缓存文件的存储时间戳),通过Data::Dumper或Storable读取中间缓存文件数据。结尾。

  4. 如果您因为#1 或#2 中的逻辑而需要重新解析,请读入“协议描述”文件,将其解析为您的数据结构。

  5. 然后使用 2 个键创建一个哈希:“protocol_description_timestamp”(值是从stat调用派生的协议描述文件的修改时间)和第二个键“数据”,值是对您刚刚生成的数据结构的引用作为结果的解析。

  6. Storable然后使用或Data::Dumper您选择的任何其他存储 Perl 数据结构的方法将该数据结构保存到中间缓存文件中。

于 2010-10-28T20:25:30.207 回答
0

您可以为此使用 Makefile。使您使用取决于协议描述的 Makefile 目标的数据结构。当 Make 注意到协议的更新时间比脚本更新时,它将运行您指定的命令来重新创建数据。

于 2010-10-28T18:18:55.653 回答