一致パターンで「リテラル」として使用する必要があるメタ文字でいっぱいの 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場合、メタ文字を無視して戻ります。$prevwww[0]
ただし、それがやりたいことのすべてである場合は、次を使用することもできますne。
if ($prev ne $ww[0]){
#do this if $prev and $ww[0] are not the same
}
また、@toolic が言及したように、次の行をスクリプトの先頭に追加します。
use warnings;
これにより、スクリプトで発生する可能性のある問題に関するフィードバックが得られます。