2017-10-28 11 views
5

セグメントに分割できない規則的な屈折パターンがあるとします。例えば。 (単語の中にいくつかの文字を追加する)か、母音を変更する(ablaut)ことができます。ドイツ語の例を考えてみましょう。Perl 6でリテラル正規表現を変更できますか?

my @words = <Vater Garten Nagel>; 
my $search = "/@words.join('|')/".EVAL; 

"mein Vater" ~~ $search;        
say $/; # 「Vater」 

すべての3つのドイツ語の単語は、彼らの第二の手紙「」を「A」を変更することにより、複数形。だから "Vater"→ "Väter"、 "Garten"→ "Gärten"、 "Nagel"→ "Nägel"

$search正規表現を複数の形式に一致するように変更する方法はありますか? は、ここに私が探しているものです:

my $search_ä = $search.mymethod; 
"ihre Väter" ~~ $search_ä; 
say $/; # 「Väter」 

はもちろん、私は新しいregex@words配列と「プリコンパイル」を、それを変更することができます。しかし、既存のregexを直接変更することは可能であれば可能です。

+1

作業状態とあなたのコードを決定した後は十分に速くはありません。 –

+0

@BradGilbert、この最適化をデフォルトで使用する場合の可能性のある欠点は何ですか(一般に、私は何百もの検索キーと巨大なテキストコーパスを扱いますので、コードの柔軟性が低く、エレガントでないことを除けば。 –

答えて

7

できません。

RegexesはPerl 6のコードオブジェクトです。あなたの質問には基本的に「サブルーチンやメソッドを書いた後に変更できますか?」という質問があります。そして、答えは伝統的なコードオブジェクトと正規表現では同じです。いいえ、最初にそれらを書いてください。

つまり、実際にはEVALは必要ありません。あなたが正規表現の内側に配列変数を使用する場合は、あなただけ書くことができるので、代替枝のリストとして補間されます。

my @words = <Vater Garten Nagel>; my $search = /@words/;

あなたが@wordsを変更するので、もし正規表現$searchは、閉鎖となり、あなたも$searchと一致するものを変更してください。

この特定の例の別のアプローチもä一致aを作る:ignoremark修飾子を使用することであろう(例えばāǎなどの他の形態のもかかわらず、たくさん、。)あなただけにそれを取得した後に最適化する必要があり

+1

説明をありがとう! '/ @ words /'の代わりに 'EVAL'を使用する場合、実際のデータでは' @ words'検索配列には通常数百のキーが含まれているという問題があります。ですから、私がEVALでプリコンパイルしないと、プログラムは本当に遅くなります。私はこの問題についていくつかの質問をしてきました。もっと良い解決策があれば教えてください。 ①[正規表現の速度](https://stackoverflow.com/questions/46867216/regex-speed-in-perl-6)②[配列のフィルタリング](https://stackoverflow.com/questions/46933838/filtering-elements -of-an-array-with-another-array-per-per-6) –

関連する問題