首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Perl中有没有重载正则表达式绑定操作符`=~`的方法?

在Perl中有没有重载正则表达式绑定操作符`=~`的方法?
EN

Stack Overflow用户
提问于 2010-09-14 06:28:24
回答 1查看 588关注 0票数 19

我正在开发一个小型的领域特定语言,它使用重载的nomethod回退来捕获在重载值上使用的运算符。这类似于overload文档中描述的symbolic calculator的功能。

这对于标准比较运算符很有效,但请考虑以下几点:

代码语言:javascript
复制
my $ret = $overloaded =~ /regex/;

在这种情况下,会调用nomethod$overloaded进行字符串化,之后重载就会丢失。我考虑过返回一个绑定变量,这至少可以让我携带原始的重载对象,但在执行regex的过程中,它仍然会丢失。

所以,最终的问题是,是否有任何方法可以扩展overload的符号计算器的概念,以包括正则表达式绑定操作符=~!~,以便上面的代码样例可以用($overloaded, qr/regex/, 0, '=~')或类似的东西调用nomethod

我还简要地研究了重载smartmatch操作符~~,但这似乎也没有起到作用(总是默认使用正则表达式匹配,而不是重载)。

编辑:我查看了~~ more,发现my $ret = $overloaded ~~ q/regex/的工作归功于智能匹配规则。很接近,但不是一个理想的解决方案,我希望它能在5.10之前工作,所以我欢迎其他答案。

EN

回答 1

Stack Overflow用户

发布于 2010-09-16 08:15:26

我觉得DSL最好用Perl语言中的source filters编写。你可以做任何你想做的事。;-)在您的示例中,您可以使用正则表达式将FOO =~ BAR替换为myfunc(FOO,BAR)并运行任意代码。

下面是一个示例解决方案:

代码语言:javascript
复制
# THE "MyLang" SOURCE FILTER
package MyLang;
use strict;
use warnings;
use Filter::Util::Call;

sub import {
    my ($type, @args) = @_;
    my %p = @args;
    no strict 'refs';
    my $caller = caller;
    # Create the function to call
    *{"${caller}::_mylang_defaultmethod"} = sub {
        my ($a, $op, $b) = @_;
        $p{nomethod}->($a, $b, 0, $op);
    };
    my ($ref) = [];
    filter_add(bless $ref);
}

sub filter {
    my ($self) = @_;
    my ($status);
    if ($status = filter_read() > 0) {
        $_ =~ s/([^=]+)(=~)([^;]+)/ _mylang_defaultmethod($1,'$2',$3)/g;
    }
    $status;
}

1;

示例用法

代码语言:javascript
复制
use MyLang nomethod => \&mywrap;

my $a = "foo";
my $b = "bar";
$x = $a =~ $b;

sub mywrap {
   my ($a, $b, $inv, $op) = @_;
   print "$a\n";
}

现在,上面的代码将打印"foo\n“,因为它就是"$a”变量中的内容。当然,您可能希望对过滤器中的正则表达式替换进行一些稍微更智能的解析,但这是一个简单的概念证明。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3704891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档