如何使用B::Hooks来操作Perl解析器

15

我希望尝试一下Perl解析器的操作。看起来各种B::Hooks模块是人们使用的工具。我在想:

  1. 对于一个没有XS经验的人来说,最好从哪里入手?有相关的博客文章吗?

  2. 创建一个新的运算符需要多少工作量?例如:

    $a~>one~>two~>three

~> 将像 -> 一样工作,但它不会尝试调用 undef 并且而是简单地将 undef 返回到左侧。

虽然源代码过滤器也可以实现这个功能,但我更感兴趣的是看看如何在更深层次上操作解析器。


4
听起来像一个有趣的功能。 :) - brian d foy
在使用Mojo::DOM时,我正在做if( $dom->at('div')->at('h1')) { ,但由于div不存在而导致出现“无法调用未定义”的错误,这让我感到非常烦恼,于是我想到了一个解决方法。 - LLFourn
1
你考虑过使用autobox吗?一个非常简单的包含基本AUTOLOAD例程的软件包就足够了。你不需要新的运算符,只需将所有可能的方法添加到undef中即可。这可能会对性能产生可怕的影响。像这样:use autobox UNDEF => 'SilentUndef'; … your code… package SilentUndef; sub AUTOLOAD {sub{}} - Patrick J. S.
2
当我过去做一些XS(现在完全忘记了)时,我是从http://perldoc.perl.org/perlxstut.html开始的。对于添加新运算符,我可能会从http://perldoc.perl.org/perlguts.html#Custom-Operators开始。 - polettix
@polettix 看起来正是我需要的。我想使用 B::Hooks::OP::Check 并钩住自定义操作符 OP 是开始的地方。我将无法在一个月左右测试这个理论。 - LLFourn
显示剩余3条评论
1个回答

1
我不相信你可以添加中缀运算符(其操作数在运算符之前和之后),更不用说符号运算符(与命名运算符相对)了,但是您可以编写一个操作符检查器来替换方法调用。这意味着您可以使->foo的行为不同。通过将您的模块编写为pragma,您可以将您的模块的影响限制在词法作用域内(例如{ use mypragma; ...})。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接