这在5.8和5.10中一直在为我工作,但在5.12中我的代码创建了这个奇怪的非qr对象:
# running "print Dumper($regex)"
$VAR1 = bless( do{\(my $o = '')}, 'Regexp' );
Run Code Online (Sandbox Code Playgroud)
打印qr //不是由我的代码创建的,如下所示:
# running "print Dumper(qr/foo/i)"
$VAR1 = qr/(?i-xsm:foo)/;
Run Code Online (Sandbox Code Playgroud)
我的代码基本上是:
REGEXP *rx = re_compile(pattern, flags);
SV *regex = sv_2mortal(newSVpv("",0));
sv_magic(regex, (SV*)rx, PERL_MAGIC_qr, 0, 0);
stash = gv_stashpv("Regexp", 0);
sv_bless(newRV((SV*)regex), stash);
Run Code Online (Sandbox Code Playgroud)
任何人都知道如何从5.12中的字符串正确创建一个正则表达式?
我正在编写一个使用Getops接受用户输入的小程序,并且基于它,程序将尝试将模式与某些文本匹配,或者将文本替换为匹配的文本.
我遇到的问题是我无法让替换部分工作.我正在查看手册页中的qr //条目:http://perldoc.perl.org/perlop.html#Regexp-Quote-Like-Operators但我没有运气.我试图模拟我的代码,就像本案例中的文档一样.我编译一个匹配模式,并将其替换为替换.
有人能指出我哪里错了吗?(不要太担心安全性,这只是个人用的小脚本)
这就是我在看的内容:
if($options{r}){
my $pattern = $options{r};
print "\nEnter Replacement text: ";
my $rep_text = <STDIN>;
#variable grab, add flags to pattern if they exist.
$pattern .= 'g' if $options{g};
$pattern .= 'i' if $options{i};
$pattern .= 's' if $options{s};
#compile that stuff
my $compd_pattern = qr"$pattern" or die $@;
print $compd_pattern; #debugging
print "Please enter the text you wish to run the pattern on: ";
my $text = <STDIN>;
chomp $text;
#do …Run Code Online (Sandbox Code Playgroud) 有没有一种简单的方法可以将正则表达式修饰符(如"i")添加到引用的正则表达式中?例如:
$pat = qr/F(o+)B(a+)r/;
$newpat = $pat . 'i'; # This doesn't work
Run Code Online (Sandbox Code Playgroud)
我能想到的唯一方法就是print "$pat\n"回过头来(?-xism:F(o+)B(a+)r)尝试?-xism:用替换去除'i'
在使用Perl的qr {}构造时,我很难确定必须转义哪些字符
我正在尝试为包含大量正常转义字符(#*.>:[])的文本创建多行预编译正则表达式,并且还包含另一个预编译的正则表达式.另外,我需要尽可能严格地进行匹配以进行测试.
my $output = q{# using defaults found in .config
*
*
Options:
1. opt1
> 2. opt2
choice[1-2?]: };
my $sc = qr{(>|\s)}smx;
my $re = qr{# using defaults found in .config
*
*
Options:
$sc 1. opt1
$sc 2. opt2
choice[1-2?]: }mx;
if ( $output =~ $re ) {
print "OK!\n";
}
else {
print "D'oh!\n";
}
Run Code Online (Sandbox Code Playgroud)
错误:
Quantifier follows nothing in regex; marked by <-- HERE in m/# using defaults found in .config …Run Code Online (Sandbox Code Playgroud)