在 Raku 中解析二进制文件

Whi*_*ist 14 rakudo raku

我想使用 Raku 的正则表达式/语法引擎解析二进制文件,但我没有找到如何做到这一点,因为输入被强制转换为字符串。

有没有办法避免这种字符串强制并使用BufBlob类型的对象?

我在想也许可以改变元模型中的某些东西?

我知道我可以使用unpack,但我真的很想使用安装的语法引擎以获得更大的灵活性和可读性。

我是否遇到了 Raku 功能的固有限制?

在有人告诉我正则表达式用于字符串并且我不应该这样做之前,应该指出 Perl 的正则表达式引擎可以匹配字节,据我所知,我可能可以将它与 Regexp::Grammars 一起使用,但我不想使用 Raku 来代替。

另外,我不明白为什么正则表达式应该只保留给字符串,自动机理论的 NFA 本质上并不是为字符而不是字节而设计的。

Jon*_*ton 11

有没有办法避免这种字符串强制并使用 Buf 或 Blob 类型的对象?

不幸的是目前还没有。但是,可以使用Latin-1编码,它为每个字节赋予含义,因此任何字节序列都将解码为它,然后可以使用语法进行匹配。

另外,我不明白为什么正则表达式应该只保留给字符串,自动机理论的 NFA 本质上并不是为字符而不是字节而设计的。

没有一个;人们普遍预计正则表达式/语法引擎将在未来的某个时候重建(主要是为了处理性能限制),这也是考虑处理字节和代码点级别字符串()的好时机Uni

  • `raku -e 'say (Blob.new(239, 187, 191).decode("latin-1") ~~ / ^ ("\x[EF]\x[BB]\x[BF]") $ /)[0].encode("latin-1")'` (3认同)
  • `说“abbc”~~ /“\x62”+ /; # 「bb」` (2认同)