Почему строки не совпадают? - PullRequest
1 голос
/ 14 апреля 2011

У меня есть файл Wordpad, из которого я извлекаю две строки и сравниваю их.В этом случае они оба равны, но я не могу использовать выражение =~ для их оценки.

if($pin_list =~ /$lvl_list/){ do something}

Что я пробовал в режиме отладки:

  1. Обе строкиравно, как вычислено eq
  2. Обе строки равны, как вычислено ==
  3. Вручную установите другую переменную в той же строке и затем выполните оператор if с новой переменной;if($pin_list =~ /$x/){do something}.Эта попытка была успешной.
  4. Выполнено chomp(var) на обеих строковых переменных несколько раз, а затем запустил код.FAILED
  5. Убран возврат каретки через $tst_pins =~ s/\n//g в обоих вариантах.FAILED
  6. Длина обоих переменных одинакова.
  7. Отпечатаны вручную как переменные, так и визуально проверены обе строки одинаковые.

У кого-нибудь есть идеи?Я подозреваю, что это связано с WordPad и, возможно, со скрытым символом, но не знаю, как его отследить.


tchrist -> Хороший вопрос.В этом случае строки равны, но это не всегда будет так.В обычных условиях я просто ищу, чтобы одна строка была подмножеством другой.


Для тех, кому это может быть интересно.Проблема решена.

У меня была строка, к которой я «присоединился» с помощью «+».Таким образом, строка выглядела следующим образом:

"1 + 2 + 3 + 4 + a + b + и т. Д."

Проблема "+" в конечном итоге стала проблемой.По предложению коллеги я выполнил субстрат и утащил одну из струн до точки оскорбления.Это произошло сразу после того, как он захватил «+».Затем я присоединился, используя пробел вместо «+», и все работает.

Использование других символов, кроме алфавита, окажет влияние, которое я до сих пор затрудняюсь объяснить, почему, когда все остальное говоритэто было равно.

Брет

Ответы [ 2 ]

4 голосов
/ 14 апреля 2011

Оператор сопоставления (m// aka //) проверяет, соответствует ли предоставленная строка предоставленному шаблону регулярных выражений, а не если это символ для символа, равного предоставленному шаблону регулярных выражений.Если вы хотите построить шаблон регулярного выражения, который будет точно соответствовать строке, используйте quotemeta.

. Это проверяет, равен ли $str1 $str2:

my $pat = quotemeta($str1);
$str2 =~ /^$pat\z/

quotemeta также можно вызвать через \Q..\E.

$str1 =~ /^\Q$str2\E\z/

Конечно, вы можете просто использовать eq.

$str1 eq $str2
3 голосов
/ 14 апреля 2011

+ и другие символы имеют специальные значения внутри регулярных выражений, поэтому простое использование $expression =~ /$some_arbitrary_string/ может привести к неприятностям.

Если вопрос заключается в том, содержится ли одна строка буквально в другой строке, вы можете использовать index и не беспокоиться обо всех правилах для указания регулярных выражений:

if (index($pin_list, $lvl_list) >= 0) {
    do_something;
}
...