Perl: Почему эквалайзер работает, когда = ~ не работает? - PullRequest
4 голосов
/ 09 июня 2011

Рабочий код:

if ( $check1 eq $search_key ...

Предыдущий код с ошибками:

if ( $check1 =~ /$search_key/ ...

Слова (в $check1 и $search_key) должны совпадать, но почему2-й возвращают истину все время?Чем они отличаются?

$check1 приобретается путем разделения.$search_key вводится либо до ("word"), либо во время выполнения: (<>), затем оба передаются в подпрограмму.

Еще один вопрос: можно ли преобразовать следующее без какого-либоскрытые проблемы?

if ($category_id eq "subj") {

Я хочу иметь возможность сказать: =~ /subj/ чтобы "субъект" все равно оставался верным.

Заранее спасибо.

Ответы [ 3 ]

12 голосов
/ 09 июня 2011

$check1 =~ /$search_key/ не работает, потому что любые специальные символы в $search_key будут интерпретироваться как часть регулярного выражения.

Кроме того, это действительно проверяет, содержит ли $check1 подстроку $search_key.Вы действительно хотели $check1 =~ /^$search_key$/, хотя это все еще неправильно из-за причины, указанной выше.

Лучше придерживаться eq для точного сравнения строк.

11 голосов
/ 09 июня 2011

, как упоминалось ранее, специальные символы в $ search_key будут интерпретироваться, чтобы предотвратить это, используйте \Q: if ( $check1 =~ /\Q$search_key/), что примет содержание $search_key в качестве литерала. Вы можете использовать \E, чтобы завершить это if ( $check1 =~ /\b\Q$search_key\E\b/), например.

Эта информация в perlre

1 голос
/ 09 июня 2011

Что касается вашего второго вопроса, если вы хотите просто сопоставить подстроки, вы можете использовать функцию index . Затем замените

if ($category_id eq "subj") {

с

if (0 <= index $category_id, "subj") {

Это совпадение с учетом регистра.

Дополнение для уточнения: оно будет соответствовать asubj, subj и даже subjugate

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...