2009-09-17 16 views

Odpowiedz

3

"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.

+0

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

+0

@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

24

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.

+2

Oprócz 'perldoc perlop', możesz sprawdzić' perlopref' - dzieło w toku - na Github: http://github.com/cowens/perlopref – Telemachus

6

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.

15

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:

  • Czytelność - To jest bardziej zwięzły, zawierające mniej znaków specjalnych.
  • Maintainability - z wzorem regex, trzeba uciec żadnych znaków specjalnych, które mogą pojawić się w ciągu, lub użyć dodatkowych markerów, takich jak \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.)
  • wydajność - nie ponosisz napowietrznej rozpalania silnik regex tylko porównać ciąg. Jeśli na przykład dzieje się to kilka milionów razy w twoim programie, korzyść jest godna uwagi.

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.

2

=~ 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.

Powiązane problemy