私はPerlの初心者ですが、キャプチャ、またはコードアサーションなどの他の種類の副作用で正規表現変数を作成し、補間を使用してこの正規表現をより大きな正規表現構成に挿入するとどうなるか疑問に思っていました。このプロセスをもう一度繰り返しますか?
副作用の動作に関して、最終的な構成が実際に何をするかを制御することは混乱していますか、それとも可能ですか? これに関するドキュメントはありますか?
私はPerlの初心者ですが、キャプチャ、またはコードアサーションなどの他の種類の副作用で正規表現変数を作成し、補間を使用してこの正規表現をより大きな正規表現構成に挿入するとどうなるか疑問に思っていました。このプロセスをもう一度繰り返しますか?
副作用の動作に関して、最終的な構成が実際に何をするかを制御することは混乱していますか、それとも可能ですか? これに関するドキュメントはありますか?
これに関するドキュメントはたくさんあり、Perl に付属しています。:)
まず、Perl がパターンの文字を処理する前に補間が行われます。二重引用符で囲まれたコンテキストでの操作の順序を理解します。補間された文字列内のすべての特殊文字は依然として特殊です。
あなたの質問に答えるには、試してみる必要があります。
use v5.10;
my $start = qr/(Buster|Mimi)/;
say "Starting regex --> $start";
my $middle = qr/My (cat is $start)/i;
say "Middle regex --> $middle";
my $end = qr/Find \s+ "$middle"/x;
say "End regex --> $end";
これは、各正規表現がより大きな正規表現に埋め込まれ、そのオプションを保持していることを示しています。
Starting regex --> (?^:(Buster|Mimi))
Middle regex --> (?^i:My (cat is (?^:(Buster|Mimi))))
End regex --> (?^x:Find \s+ "(?^i:My (cat is (?^:(Buster|Mimi))))")
キャプチャのルールは各レベルで同じです。それらは、開始キャプチャ括弧の順序によって決定されます。Perl は、ネストの種類や「誰が最初にそこに到達したか」を追跡しません。番号付きのキャプチャ変数を追跡したくない場合は、名前付きキャプチャを使用できます。
こんな感じですか?
my $name = "bob";
while ($name_from_file = <STDIN>) {
chomp $name_from_file;
if ($name_from_file =~ /^$name\n/i)
print "I got something for $name!\n";
}
はい、できます。
ただし、より良い方法はqr
、正規表現の構築を支援するために使用することです。
my $re_name = qr(^) . qr(bob) . qr(\s);
while ($name_from_file = <STDIN>) {
chomp $name_from_file;
if ($name_from_file =~ /$re_name/i)
print "I got something for $name!\n";
}
このようにして、正規表現は変数をより簡単に補間できます。