perl6 如何使用副词作为变量?
perl6 How to use adverbs as variables?
我正在尝试匹配区分大小写或不区分大小写的字符串。有没有办法让 .match
方法将副词作为变量?
my $aString = "foo bar baz";
my @anArray = <OO AR AZ>;
my $anAdverb = :i;
my $firstCheck = ($aString.match(/$anAdverb "@anArray[0]" /)).Bool;
在正则表达式中使用 $anAdverb
无效。有解决方法吗?
在表达式上下文中(即在参数列表之外),:foo
创建一个 Pair
对象。
然后可以使用 |
:
将此对象作为副词插入到参数列表中
my $adverb = :g;
say "a 1 b 2".match(/\d/, |$adverb);
很遗憾,.match
方法不支持 :i
副词。 (可以说是疏忽 - 可能会打开 Rakudo 错误报告。)
我认为没有办法将副词 插入正则表达式 。
您可以将正则表达式存储为字符串,并使用 <$foo>
语法在运行时将其计算为两个不同的 "wrapper" 正则表达式之一(一个带有 :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>/);
但是,如果任何用户提供的数据最终出现在正则表达式中,这是不安全的。
当然,如果整个正则表达式只匹配文字子字符串,则不需要 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/);
我正在尝试匹配区分大小写或不区分大小写的字符串。有没有办法让 .match
方法将副词作为变量?
my $aString = "foo bar baz";
my @anArray = <OO AR AZ>;
my $anAdverb = :i;
my $firstCheck = ($aString.match(/$anAdverb "@anArray[0]" /)).Bool;
在正则表达式中使用 $anAdverb
无效。有解决方法吗?
在表达式上下文中(即在参数列表之外),:foo
创建一个 Pair
对象。
然后可以使用 |
:
my $adverb = :g;
say "a 1 b 2".match(/\d/, |$adverb);
很遗憾,.match
方法不支持 :i
副词。 (可以说是疏忽 - 可能会打开 Rakudo 错误报告。)
我认为没有办法将副词 插入正则表达式 。
您可以将正则表达式存储为字符串,并使用 <$foo>
语法在运行时将其计算为两个不同的 "wrapper" 正则表达式之一(一个带有 :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>/);
但是,如果任何用户提供的数据最终出现在正则表达式中,这是不安全的。
当然,如果整个正则表达式只匹配文字子字符串,则不需要 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/);