我希望能够向一个函数传递的正则表达式添加 "m" 修饰符。
以下测试脚本演示了我所要做的事情。
以下测试脚本演示了我所要做的事情。
#!/usr/bin/env perl
use strict;
use warnings;
use v5.16.3;
use Test::More tests => 3;
my $no_m_modifier_re = qr{^line1\n^line2};
my $with_m_modifier_re = qr{^line1\n^line2}m;
my $text = <<'EoM';
line1
line2
line3
EoM
unlike( $text, $no_m_modifier_re, 'Text will not match ^ that is equivalent to \A' );
like( $text, $with_m_modifier_re, 'Text will match ^ with m modifier' );
# This fails to add the m modifier to the subexpression
my $add_m_modifier_re = qr{(?m)$no_m_modifier_re};
#my $add_m_modifier_re = qr{(?m:$no_m_modifier_re)}; # Experimented other syntax, with same result
#my $add_m_modifier_re = qr{$no_m_modifier_re}m;
#my $add_m_modifier_re = qr{(?^m:$no_m_modifier_re)}; # suggested by mob, didn't work.
like( $text, $add_m_modifier_re, 'Want this to match, but it fails to add m modifier to subexpression' );
结果如下:
$ prove -v m_modifier.pl
m_modifier.pl ..
1..3
ok 1 - Text will not match ^ that is equivalent to \A
ok 2 - Text will match ^ with m modifier
not ok 3 - Want this to match, but it fails to add m modifier to subexpression
# Failed test 'Want this to match, but it fails to add m modifier to subexpression'
# at m_modifier.pl line 25.
# 'line1
# line2
# line3
# '
# doesn't match '(?^:(?m)(?^:^line1\n^line2))'
# Looks like you failed 1 test of 3.
Dubious, test returned 1 (wstat 256, 0x100)
Failed 1/3 subtests
Test Summary Report
-------------------
m_modifier.t (Wstat: 256 Tests: 3 Failed: 1)
Failed test: 3
Non-zero exit status: 1
Files=1, Tests=3, 1 wallclock secs ( 0.04 usr 0.01 sys + 0.14 cusr 0.05 csys = 0.24 CPU)
Result: FAIL
正如你所看到的,我尝试了不同的语法来添加m修饰符,但似乎没有一个适用于原始模式。
有什么想法吗?
这是在Perl 5.16.3下进行的。 我还没有尝试过更现代的版本。