2016-12-20 3 views
5

大文字と小文字を区別しないか、大文字と小文字を区別しない文字列とのマッチングを試みています。 .matchメソッドで副詞を変数にする方法はありますか?perl6副詞を変数として使う方法は?

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

正規表現内で$anAdverbを使用すると動作しません。回避策はありますか?

答えて

4

:fooは、式コンテキスト(すなわち、引数リストの外側)でPairオブジェクトを作成します。
このオブジェクトは、その後|を使用して、引数リストに副詞として補間することができます。

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

残念ながら、.match方法は:i副詞をサポートしていません。 (間違いなく見落とし - おそらくRakudoのバグレポートを開きます)

副詞を正規表現に挿入する方法はありません。

あなたは文字列として、あなたの正規表現を格納し、2つの異なる「ラッパー」正規表現(:iと1、および1なし)の一つに、実行時にそれをevalに<$foo>構文を使用することができます。

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/); 
+2

は、あなたがあなたの助けSMLSありがとうございます!私は再びマッチ・ルーチンのdocページをチェックしますが、それ以外の副詞はすべてあります。 https://docs.perl6.org/routine/match – lisprogtor

関連する問題