2017-05-17 1 views
2

正規表現を使用するプログラムがあり、何とか私はそれを理解することができません。誰かが私にこの正規表現をperlで説明できますか?

コードが+になる - このように:私は理解してどのような

@listOfIds = &methodToGetIDs(); 
foreach my $id (@listOfIds){ 
    if($class =~ /gen/ig){ 
     #does stuff 
    } 
} 

$class"gen"を持っているならば、それはif{}になりますが、時にはそれはそれに入れないということですので、私は他を置きます何が起きているのかを確認し、コードは次のようになります。

my $class = "genes"; 
foreach my $id (@listOfIds){ 
    if($class =~ /gen/ig){ 
     print $class."\n"; #to see the value of class 
    }else{ 
     print "!!!".$class."\n"; #to see the difference if there's any 
    }#miss this wooops! 
} 

それはelse節に入ったんなぜ$classの値が、その後変更されない場合

genes 
genes 
!!!genes 
genes 
genes 
!!!genes 
genes 
genes 
!!!genes 

:出力は次のようでしたか?私は正規表現を全く理解していないと思う。すべての手がかりは?

答えて

2

/gオプションを使用しているためです。 perlopから:それ以上の一致がない場合

スカラーコンテキストでは、m//gの各実行は、それが一致した場合はtrueを返し、次の一致を見つけ、偽。最後に一致した後の位置は、pos()関数を使用して読み取りまたは設定できます。 posを参照してください。失敗した一致は、通常、検索位置を文字列の先頭にリセットします。

文字列を最初に見たときに一致します。次に、最初にマッチしたポジションの次にスタートします。私。その位置は文字列の先頭にリセットされず、最初の一致が発生した場所で継続されます。

/gフラグは、すべてと一致させたいことを示すために使用されます。これは、文字列内に部分文字列が何回現れるかを数えるのに便利です。あなたの場合は、パターンがまったく一致するかどうかをテストしており、そうであれば何かを実行します。この場合、/gフラグは必要ありません。

my $class = "genes"; 

foreach my $id (1..6){ 
    if($class =~ /gen/ig){ 
     print $class."\n"; #to see the value of class 
    }else{ 
     print "!!!".$class."\n"; #to see the difference if there's any 
    } 
} 

出力:

genes                                           
!!!genes                                           
genes                                           
!!!genes                                           
genes                                           
!!!genes 

あなたが/gフラグを削除した場合、あなたが得るながら:

genes                                           
genes                                           
genes                                           
genes                                           
genes                                           
genes 
+0

魅力的な紳士に感謝、今私は理解しています。なぜ彼はそれを書いたのか、彼は達成しようとしていました。 – ILoveNachos

0

perlopマンページ読み取り:スカラーコンテキストで

をさらなる一致がない場合、M // Gの各実行は、それが一致する場合 がtrueを返し、次のマッチを見つけ、そして偽。

ifはあなたの式にスカラコンテキストで条件を評価しているので、さらにマッチ(それは二回印刷し、なぜ私は理解していない、とあなたのコード何が存在しないよう、すべての時間は、それが最初にtrueを返し、その後、偽のよコンパイルされません)。

しかし、注意して:

if ($class =~ /gen/i) { 

常に$class = "genes"いるので、あなたの例では真となり、変更することは表示されません。代わりに$idをチェックするつもりでしたか?

いずれにしても、/g修飾語は使用しているコードに適していないようです。

+0

ない先生を、それが$クラスを評価し、それは私が理解していないものだ、なぜ$ classが変更されないと評価しますか?それは私が書いたコードではありませんが、私はそれを複製する必要があるので、Pythonのために理解する必要があります。 編集:私は1つが}おかげで、私に教えてくれます。 – ILoveNachos

関連する問題