В чем разница между " 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 здесь, потому что это понятнее и быстрее.