Perl, сопоставление шаблонов и метасимволы

Я пытаюсь сопоставить две вещи, в которых оба полны метасимволов, которые должны использоваться как "Литерал" в моем шаблоне соответствия. \Q предположим, что он должен указывать весь метасимвол в строке до \E... но это не работает.

Что с этим?

это линия, которая вызывает у меня проблемы: if (/\Q$prev\E/!~/\Q$ww[0]\E/) {

2 ответа

Отсутствие использования =~ or !~,

/.../

сокращается для

$_ =~ 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; 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;

Это даст вам некоторые отзывы о возможных проблемах в ваших сценариях.

licensed under cc by-sa 3.0 with attribution.