В чем разница между этими двумя операторами? В частности, какая разница в $a
приведет к разному поведению между двумя?
$a =~ /^pattern$/
$a eq 'pattern'
В чем разница между этими двумя операторами? В частности, какая разница в $a
приведет к разному поведению между двумя?
$a =~ /^pattern$/
$a eq 'pattern'
"pattern\n":)
$a = "pattern\n";
print "ok 1\n" if $a =~ /^pattern$/;
print "ok 2\n" if $a eq 'pattern';
Возможно, вы имели в виду /^ pattern\z/.
eq
предназначен для проверки равенства строк, ==
- это одно и то же, но для численного равенства.
Оператор =~
предназначен для применения регулярного выражения к скаляру.
Для подробностей каждого оператора Perl и для чего они предназначены, см. man-страницу perldoc perlop.
Как отмечали другие, ($a =~ /^pattern$/)
использует механизм регулярных выражений для оценки того, являются ли строки одинаковыми, тогда как ($a eq 'pattern')
- это тест равенства простой строки.
Если вы действительно хотите узнать, идентичны ли две строки, последняя предпочтительна по причинам:
\Q
и \E
. С одной кавычкой, единственным символом, который вам нужно избежать, является одиночная кавычка. (Вы также должны избегать обратной косой черты, если за ними последует другая обратная косая черта или разделитель строк.)С другой стороны, форма регулярного выражения намного более гибкая, если вам нужно сделать что-то другое, кроме простого теста равенства строк. Подробнее о регулярных выражениях см. perldoc perlre.
EDIT: Как и все остальные до ysth, я пропустил очевидную функциональную разницу между ними и пошел прямо для более абстрактных различий. Я уточнил вопрос, но я оставлю ответ как полезную ссылку (надеюсь) полезную.
eq
- тесты для равенства строк.
=~
. Привязывает скалярное выражение к совпадению с шаблоном.
См. здесь для более подробного описания всех операторов.
=~
- оператор связывания. Он используется для привязки значения к совпадению шаблонов (m//
), подстановке (s///
) или транслитерации (tr//
или y//
).
eq
- оператор равенства строк; он сравнивает два значения, чтобы определить, равны ли они, если они считаются строками. Существует оператор peer ==
, который делает то же самое, только учитывая значения как числа. (В Perl строки и числа в большинстве случаев взаимозаменяемы, когда конверсии происходят автоматически в зависимости от того, как используются значения. Из-за этого, когда вы хотите сравнить два значения, вы должны указать тип сравнения для выполнения.)
В общем случае $var =~ m/.../
определяет, соответствует ли значение $var
шаблону, а не соответствует ли оно конкретному значению. Однако в этом случае шаблон привязывается на обоих концах и содержит только буквенные символы, поэтому он эквивалентен сопоставлению строк. Лучше использовать eq
здесь, потому что он становится яснее и быстрее.