-1

一致パターンで「リテラル」として使用する必要があるメタ文字でいっぱいの 2 つのものを一致させようとしています。 \Qまで文字列内のすべてのメタ文字を引用する\Eことになっています...しかし、それは機能しません。

どうしたの?

これは私に問題を引き起こす行です: if (/\Q$prev\E/ !~ /\Q$ww[0]\E/) {

4

2 に答える 2

11

=~または!~を使用しない場合

/.../

の略です

$_ =~ m/.../

それで

/\Q$prev\E/ !~ /\Q$ww[0]\E/

の略です

($_ =~ /\Q$prev\E/) !~ /\Q$ww[0]\E/

これは、左の正規表現の一致が成功するかどうかに応じて、次のいずれかと同等です。

"" !~ /\Q$ww[0]\E/
"1" !~ /\Q$ww[0]\E/

あなたは単に欲しい:

$prev !~ /\Q$ww[0]\E/   # $ww[0] doesn't contains $prev

本当に欲しいなら

$prev !~ /^\Q$ww[0]\E\z/   # $ww[0] isn't equal to $prev

次に、それを単純化できます

$prev ne $ww[0]   # $ww[0] isn't equal to $prev

ちなみにいつも使ってますuse strict; use warnings;。ここで問題が特定された可能性があります (ただし、 の値によっては必ずしもそうとは限りません$_)。

于 2012-02-28T16:56:50.890 に答える
2

の文字列を の文字列と比較したいよう$prevです$ww[0]。この場合、正規表現の一致は次のようになります。

$result = $prev !~ /\Q$ww[0]\E/

$resultが にあるものと同じでない1場合、メタ文字を無視して戻ります。$prevwww[0]

ただし、それがやりたいことのすべてである場合は、次を使用することもできますne

if ($prev ne $ww[0]){ 
   #do this if $prev and $ww[0] are not the same
} 

また、@toolic が言及したように、次の行をスクリプトの先頭に追加します。

use warnings;

これにより、スクリプトで発生する可能性のある問題に関するフィードバックが得られます。

于 2012-02-28T16:51:33.470 に答える