Jaka jest różnica między tymi dwoma operatorami? Konkretnie, jaka różnica w $a
doprowadzi do różnych zachowań między tymi dwoma?Jaka jest różnica między "eq" i "= ~" w Perlu?
$a =~ /^pattern$/
$a eq 'pattern'
Jaka jest różnica między tymi dwoma operatorami? Konkretnie, jaka różnica w $a
doprowadzi do różnych zachowań między tymi dwoma?Jaka jest różnica między "eq" i "= ~" w Perlu?
$a =~ /^pattern$/
$a eq 'pattern'
"wzór \ n" :)
$a = "pattern\n";
print "ok 1\n" if $a =~ /^pattern$/;
print "ok 2\n" if $a eq 'pattern';
Może chodziło/^ \ Z/wzór.
Jepp, racja - to było rozwiązanie - to był tylko małe pytanie w moim miejscu pracy - nie jestem programistą back-end, ale byłem ciekawy - akceptacja białych znaków była różnicą :) – user150283
@chronotype: nie białe spacje w ogóle; konkretnie pojedynczy znak nowej linii ("wzór \ n \ n" lub "wzór \ t" nie pasowałby). $ (bez/m) dopasowuje koniec napisu lub tuż przed znakiem nowej linii na końcu łańcucha. – ysth
eq
jest dla równości testowanie strun ==
to samo, ale o równość numerycznej.
Operator =~
służy do zastosowania wyrażenia regularnego do skalara.
Szczegółowe informacje na temat każdego operatora Perla i do czego służą, znajdują się na stronie man: perldoc perlop.
Oprócz 'perldoc perlop', możesz sprawdzić' perlopref' - dzieło w toku - na Github: http://github.com/cowens/perlopref – Telemachus
eq
- Testy na równość łańcuchów.
=~
- Wiąże wyrażenie skalarne z dopasowaniem wzoru.
Aby uzyskać bardziej szczegółowe opisy wszystkich operatorów, zobacz stronę here.
Jak zauważyli inni, ($a =~ /^pattern$/)
używa silnika wyrażeń regularnych do oceny, czy ciągi znaków są identyczne, podczas gdy ($a eq 'pattern')
to test równania ciągłego.
Jeśli naprawdę chcą tylko wiedzieć, czy dwa ciągi są identyczne, to ostatnie jest korzystne ze względu na:
\Q
i \E
. W przypadku pojedynczego cudzysłowu jedyną postacią, którą musisz uciec, jest pojedynczy cytat. (Trzeba też uciec backslashy jeśli są po innej backslashem lub separatora strun.)Z drugiej strony, forma regex jest znacznie bardziej elastyczne, jeśli trzeba coś zrobić inne niż zwykłego testu równości ciąg. Więcej informacji na temat wyrażeń regularnych można znaleźć na stronie perldoc perlre.
EDIT: Podobnie jak większość wszyscy przed ysth, brakowało mi oczywistej różnicy funkcjonalny między nimi i poszedł prosto do bardziej abstrakcyjnych różnic. Wyjaśniłem to pytanie, ale pozostawię odpowiedź jako (miejmy nadzieję) przydatne odniesienie.
=~
jest operatorem wiążącym. Służy do wiązania wartości do dopasowania wzoru (m//
), substytucji (s///
) lub transliteracji (tr//
lub y//
).
eq
to operator równości łańcuchowej; porównuje dwie wartości, aby określić, czy są one równe, gdy są traktowane jako łańcuchy. Istnieje operator równorzędny ==
, który robi to samo, biorąc pod uwagę tylko wartości liczbowe. (W Perlu ciągi i liczby są w większości zamienne z konwersjami odbywającymi się automatycznie w zależności od użytych wartości, dlatego w celu porównania dwóch wartości należy określić typ porównania do wykonania).
Ogólnie , $var =~ m/.../
określa, czy wartość $var
pasuje do wzorca, czy nie jest równa określonej wartości. Jednak w tym przypadku wzorzec jest zakotwiczony na obu końcach i zawiera tylko literalne znaki, więc jest równoważny porównywaniu ciągów. Lepiej używać tutaj eq
, ponieważ jest bardziej przejrzysty i szybszy.
Dziękuję za odpowiedzi! – user150283