В чем разница между " eq " и "= ~ " в Perl?

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

$a =~ /^pattern$/

$a eq 'pattern'

5 ответов


"pattern\n":)

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

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


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

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

для кровавых деталей каждого оператора Perl и для чего они предназначены, см. perldoc perlop manpage.


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

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

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

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

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


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

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

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


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

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

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