Какая разница между 'eq' и '= ~' в Perl?

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

$a =~ /^pattern$/

$a eq 'pattern'

Ответ 1

"pattern\n":)

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

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

Ответ 2

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

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

Для подробностей каждого оператора Perl и для чего они предназначены, см. man-страницу perldoc perlop.

Ответ 3

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

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

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

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

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

Ответ 4

eq - тесты для равенства строк.

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

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

Ответ 5

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

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

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