使用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.

相关文章

1. 如何去重 #!/usr/bin/perl use strict; my %hash; while(...
最近写了一个perl脚本,实现的功能是将表格中其中两列的数据...
表的数据字典格式如下:如果手动写MySQL建表语句,确认麻烦,...
巡检类工作经常会出具日报,最近在原有日报的基础上又新增了...
在实际生产环境中,常常需要从后台日志中截取报文,报文的形...
最近写的一个perl程序,通过关键词匹配统计其出现的频率,让...