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