2016-09-19 4 views
2

一部のプロダクションコードで見つかったこのPerl正規表現で、コロンはどのような機能を果たしますか?正規表現がコロンで区切られているとはどういう意味ですか?

if ($r->uri =~ m:/copy/(\d+):) { 
    my $ref = $1; 

コードはURIを解析しており、2行目はキャプチャされたグループを使用しています。

+0

を 'M' を置くことによって、任意の区切り文字に変更することができ、あなたは、Perl 6やPerl 5について話していますか? Perl 5には副詞がありません。 – ThisSuitIsBlackNot

+2

Pedagonically、あなたの正規表現にはコロンがありません。正規表現はコロンの間のビットです - '/ copy /(\ d +)'。コロンはマッチ演算子の区切り文字( 'm /.../')で、正規表現の '/'文字をエスケープしないように 'm:..:'と綴られています。 –

+0

* "彼らは副詞の区切りに使用されていることは知っています" *英語で書くことを意味するのですか、Perl 6と混乱していますか? Perl 5は*副詞*と呼ばれるものは何も持っていません。 – Borodin

答えて

6

、任意の文字のように、mを省略することができることを

"string" =~ m(regex) 
"string" =~ m[regex] 
"string" =~ m{regex} 
"string" =~ m|regex| 
"string" =~ m:regex: 

注:したがって、上記の例では、同等以下のいずれかのように書くことができます。区切り文字として機能できるため、コロンは標準/に置き換わり、通常の文字になります。 perlrequickから

試合のための//デフォルトの区切り文字はアウトフロント

10

perlのm演算子を使用して、正規表現に対して文字列をテストします。通常はそのようにそれを使用します。

"string" =~ m/regex/ 

したい場合は、引用文字(上記の例では/)を変更することができます。あなたが/を使用している場合、その後、あなたは

m
"string" =~ /regex/ 
+0

デリミタとして '|'(または他のメタキャラクタ)を使用すると、ベスト・アイデアではありません.-) –

+0

@LucasTrzesniewski良い点。 – redneb

+0

Fwiw - メタ文字を区切り記号として使用することの難点は、式の本文がリテラルとして一致させようとしている場合にのみ表示されます。エンジンはエスケープされたメタキャラクタを期待し、パーサはエスケープされた区切り文字も必要とします。 (?:A | B)| 'は区切られた'(|:A | B)||がエンジンに送られます。または、区切られた 'm |(?:A \ | B)\\ ||'ならば、m''(?:A \ | B)\\ | '|末尾に '|'をつけたまま区切られます。メタキャラクタ以外のものや、{{} {}のような文脈的なものではないものを選ぶ方が良い – sln

関連する問題