微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用Perl,如何通过将参数传递给子例程来构建动态正则表达式?

我想用动态创建的regxp创建子程序.这是我到目前为止:
#!/usr/bin/perl

use strict;

my $var = 1234567890;


foreach (1 .. 9){
    &theSub($_);
}



sub theSub {
    my $int = @_;
    my $var2 = $var =~ m/(??{$int})/;
    print "$var2\n";
}

它看起来会起作用,但似乎一旦正则表达式中的$int首次得到评估,它就永远存在.

反正有没有做类似的事情,但是每次调用sub时,regex都会选择新的参数吗?

解决方法

修复代码的最简单方法是在我的周围添加括号,并删除?? {.这是固定的程序:
#!/usr/bin/perl
use strict;
my $var = 1234567890;
foreach (1 .. 9){
    theSub($_);
}
sub theSub {
    my($int) = @_;
    my($var2) = $var =~ m/($int)/;
    print "$var2\n";
}

代码中有问题的一行是我的$int = @_,它相当于我的$int = 1,因为它在标量上下文中计算@_,产生@_中的元素数.要获取sub的第一个参数,请使用my($int)= @_ ;,在列表上下文中计算@_,或者使用$int = $_ [0];获取一个元素,或者获取一个元素元素使用我的$int = shift;

在我的$var2 =行中存在类似的问题,你还需要括号来评估列表上下文中的正则表达式匹配,产生($1,$2,…)列表,并分配$var2 = $1.

你试图使用的构造(?? {…})与你想要的效果相反:(在做其他事情之间)它在第一次用于匹配时编译你的正则表达式.对于包含$或@但不包含?? {…}的regexp,Perl会自动为每个匹配重新编译regexp,除非指定o标志(例如m / $int / o).

构造(?? {…})表示:使用Perl代码生成正则表达式,并在此处插入该正则表达式.要获得更多信息,请搜索?? {http://perldoc.perl.org/perlre.html.它在你的例子中不起作用的原因是你需要额外的一层括号来捕获$1,但即使我的($var2)= $var = ~m /((?? {$int}) )/它不会有效,因为?? {有一个未记录的属性:它强制在第一次使用正则表达式进行匹配时编译其参数,所以我的($var2)= $var = ~m /(( ?? {$int 5}))/总是匹配6.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐