一致パターンで「リテラル」として使用する必要があるメタ文字でいっぱいの 2 つのものを一致させようとしています。 \Q
まで文字列内のすべてのメタ文字を引用する\E
ことになっています...しかし、それは機能しません。
どうしたの?
これは私に問題を引き起こす行です: if (/\Q$prev\E/ !~ /\Q$ww[0]\E/) {
一致パターンで「リテラル」として使用する必要があるメタ文字でいっぱいの 2 つのものを一致させようとしています。 \Q
まで文字列内のすべてのメタ文字を引用する\E
ことになっています...しかし、それは機能しません。
どうしたの?
これは私に問題を引き起こす行です: if (/\Q$prev\E/ !~ /\Q$ww[0]\E/) {
=~
または!~
を使用しない場合
/.../
の略です
$_ =~ 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;
。ここで問題が特定された可能性があります (ただし、 の値によっては必ずしもそうとは限りません$_
)。
の文字列を の文字列と比較したいよう$prev
です$ww[0]
。この場合、正規表現の一致は次のようになります。
$result = $prev !~ /\Q$ww[0]\E/
$result
が にあるものと同じでない1
場合、メタ文字を無視して戻ります。$prev
www[0]
ただし、それがやりたいことのすべてである場合は、次を使用することもできますne
。
if ($prev ne $ww[0]){
#do this if $prev and $ww[0] are not the same
}
また、@toolic が言及したように、次の行をスクリプトの先頭に追加します。
use warnings;
これにより、スクリプトで発生する可能性のある問題に関するフィードバックが得られます。