perl - 使用 Devel::Declare 创建新的 Perl 关键字

标签 perl

我在尝试使用 Devel::Declare 创建关键字时遇到问题.在这件事上没有很多例子和教程。

我最喜欢的项目是创建一个名为 doing 的新关键字。语法类似于 Ruby 的 do ,例如:

my @arr = qw/foo bar baz/;
@arr doing $x {
    print "x is $x";
};

我的想法是把它变成 for my $x (@arr) { ... } Devel::Declare 的声明解析钩子(Hook)。我不确定这是否可能。

我发现的大多数示例(来自 Devel::Declare 测试目录)用于创建 method -style 关键字。

我将不胜感激有关如何开始的一些指示,或用于处理的关键功能,或现有代码作为我的基础。

最佳答案

  • Devel::Declare 不会让您收回已经解析的内容。如果你转 doing变成一个关键字,然后 @arr doing ...仍然需要转换成以 @arr 开头的东西,这似乎是一个相当大的障碍。
  • 由于 Devel::Declare 真正发挥其魔力的方式,它以特定方式受到限制——它只允许您在 Perl 将查找子名称的地方声明看起来像子名称的“关键字”。它不会让您将任意运算符放在您喜欢的位置。事实上,在您拥有 keyword 的情况下,它的工作失真最小。一些东西{ ... }它可以变成对 keyword( 的简单调用一些其他的东西和一个可能转换的sub { ... }) .您可以看到为什么它非常适合 method 之类的东西。或 Test::Class::Sugar .我的观点是,紧跟在数组名称之后的不是 perl 解析器正在寻找子名称的地方。它是解析器寻找操作符的地方,所以@arr doing ...会给你一个bareword found where operator expected在 Devel::Declare 获得任何干预机会之前出现错误。

  • 这两个可能都可以通过改变事情来克服,以便您的关键字首先出现在行中,但是现在您有 keyword一些东西{ ... }其中数组的名称是一些东西,并且您牢牢地处于大多数其他模块已经雕刻出的模式中——只有当您生成一个 for 循环时,您可能会将该 block 作为真正的 block 留下而不是让它被解析为子定义。

    关于perl - 使用 Devel::Declare 创建新的 Perl 关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5135736/

    相关文章:

    perl - 如何摆脱 'Name ... used only once: possible typo at ...' ?

    regex - 正则表达式匹配后删除文本的有效方法

    perl - 如何包含位于不同目录中的 Perl 模块?

    Perl 正则表达式从命令行对文件进行操作

    perl - 如何在 Perl 中将变量打印到文件中?

    linux - Perl命令行多行替换

    perl - 获取和设置父进程和子进程的优先级值

    javascript - 如何在 Perl 中使用 WWW::Scripter 模块显式清除 cookie?

    perl - 字符串的数值,反之亦然

    html - 使用 Perl 从 HTML 文件中删除内联 CSS