В чем разница между 'eq' и '= ~' в Perl? - PullRequest
12 голосов
/ 17 сентября 2009

В чем разница между этими двумя операторами? В частности, какая разница в $a приведет к разному поведению между ними?

$a =~ /^pattern$/

$a eq 'pattern'

Ответы [ 5 ]

28 голосов
/ 17 сентября 2009

eq для проверки равенства строк, == это то же самое, но для числового равенства.

Оператор =~ предназначен для применения регулярного выражения к скаляру.

Подробную информацию о каждом операторе Perl и о том, для чего они, смотрите на странице perldoc perlop .

18 голосов
/ 17 сентября 2009

Как уже отмечалось, ($a =~ /^pattern$/) использует механизм регулярных выражений для оценки идентичности строк, тогда как ($a eq 'pattern') - это тест на равенство простых строк.

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

  • Удобочитаемость - Это более кратко, содержит меньше специальных символов.
  • Поддерживаемость - При использовании шаблона регулярных выражений вы должны избегать любых специальных символов, которые могут появиться в вашей строке, или использовать дополнительные маркеры, такие как \Q и \E. При использовании строки в одинарных кавычках единственный символ, который необходимо экранировать, - это одинарные кавычки. (Вы также должны избегать обратной косой черты , если за ними следует другая обратная косая черта или разделитель строк.)
  • Производительность - Вам не нужно тратить время на запуск движка регулярных выражений только для сравнения строки. Например, если это происходит в вашей программе несколько миллионов раз, выгода заметна.

С другой стороны, форма регулярного выражения гораздо более гибкая, если вам нужно сделать что-то другое , чем простой тест на равенство строк. Смотрите perldoc perlre , чтобы узнать больше о регулярных выражениях.

EDIT: Как и большинство других до ysth , я пропустил очевидную функциональную разницу между ними и пошел прямо к более абстрактным различиям. Я уточнил вопрос, но оставлю ответ как (надеюсь) полезную ссылку.

6 голосов
/ 17 сентября 2009

eq - Проверка на равенство строк.

=~ - привязывает скалярное выражение к сопоставлению с образцом.

См. здесь для более подробного описания всех операторов.

3 голосов
/ 17 сентября 2009

"шаблон \ n":)

$a = "pattern\n";
print "ok 1\n" if $a =~ /^pattern$/;
print "ok 2\n" if $a eq 'pattern';

Возможно, вы имели в виду /^pattern\z/.

2 голосов
/ 17 сентября 2009

=~ является оператором привязки. Он используется для привязки значения к сопоставлению с образцом (m//), подстановке (s///) или транслитерации (tr// или y//).

eq - оператор равенства строк; он сравнивает два значения, чтобы определить, равны они или нет, если рассматривать их как строки. Существует одноранговый оператор ==, который делает то же самое, только рассматривая значения как числа. (В Perl строки и числа в основном взаимозаменяемы, причем преобразования происходят автоматически в зависимости от того, как используются значения. Поэтому, когда вы хотите сравнить два значения, вы должны указать тип сравнения для выполнения.)

Как правило, $var =~ m/.../ определяет, соответствует ли значение $var шаблону, а не равно ли оно определенному значению. Однако в этом случае шаблон привязывается с обоих концов и не содержит ничего, кроме буквальных символов, поэтому он эквивалентен сравнению строк. Здесь лучше использовать eq, потому что он понятнее и быстрее.

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