perl6如何使用副词作为变量?

lis*_*tor 5 match perl6

我试图匹配一个区分大小写或不区分大小写的字符串.有没有办法让.match方法将副词作为变量?

my $aString = "foo bar baz";
my @anArray = <OO AR AZ>;
my $anAdverb = :i;
my $firstCheck = ($aString.match(/$anAdverb "@anArray[0]" /)).Bool;
Run Code Online (Sandbox Code Playgroud)

$anAdverb在正则表达式内部使用不起作用.有解决方法吗?

sml*_*mls 4

在表达式上下文中(即在参数列表之外),:foo创建一个Pair对象。
然后可以使用以下方法将该对象作为副词插入到参数列表中|

my $adverb = :g;
say "a 1 b 2".match(/\d/, |$adverb);
Run Code Online (Sandbox Code Playgroud)

不幸的是,该.match方法不支持:i副词。(可以说是一个疏忽——也许打开 Rakudo 错误报告。)

我认为没有办法将副词插入到正则表达式中

您可以将正则表达式存储为字符串,并使用<$foo>语法在运行时将其评估为两个不同的“包装器”正则表达式之一(一个带有:i,一个没有):

use MONKEY-SEE-NO-EVAL;

my $string = "foo bar baz";
my @array = <OO AR AZ>;
my $case-sensitive = True;
my $regex = ' "@array[0]" ';

say ?$string.match($case-sensitive ?? /:i <$regex>/ !! /<$regex>/);
Run Code Online (Sandbox Code Playgroud)

但是,如果任何用户提供的数据最终出现在正则表达式中,则这是不安全的。

当然,如果整个正则表达式仅匹配文字子字符串,则不需要 eval,您可以安全地将子字符串插入到包装器正则表达式中,如下所示:

my $string = "foo bar baz";
my @array = <OO AR AZ>;
my $case-sensitive = True;
my $substring = @array[0];

say ?$string.match($case-sensitive ?? /:i $substring/ !! /$substring/);
Run Code Online (Sandbox Code Playgroud)

  • 谢谢smls的帮助!我再次检查文档页面中的匹配例程,它包含除 :i 之外的所有其他副词。https://docs.perl6.org/routine/match (2认同)