我想用动态创建的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.