2009-09-17 17 views

risposta

3

"modello \ n" :)

$a = "pattern\n"; 
print "ok 1\n" if $a =~ /^pattern$/; 
print "ok 2\n" if $a eq 'pattern'; 

Forse volevi dire/^ modello \ z /.

+0

Jepp, giusto - questa era la soluzione - era solo un piccola domanda sul mio posto di lavoro - Non sono un programmatore di back-end, ma ero curioso - l'accettazione dello spazio bianco era la differenza :) – user150283

+0

@ synchronotype: non lo spazio bianco in generale; in particolare una singola riga ("pattern \ n \ n" o "pattern \ t" non corrisponde). $ (senza/m) corrisponde alla fine della stringa o appena prima di una nuova riga alla fine della stringa. – ysth

24

eq è per l'uguaglianza di aste di test, == è la stessa cosa, ma per l'uguaglianza numerica.

L'operatore =~ è per l'applicazione di un'espressione regolare a uno scalare.

Per i dettagli sanguinosi di ogni operatore Perl e per cosa servono, consultare la manpage perldoc perlop.

+2

Oltre a 'perldoc perlop', puoi controllare' perlopref' - un work in progress - su Github: http://github.com/cowens/perlopref – Telemachus

6

eq - Test per parità di stringhe.

=~ - Associa un'espressione scalare a una corrispondenza di modello.

Vedere here per ulteriori descrizioni approfondite di tutti gli operatori.

15

Come altri hanno notato, ($a =~ /^pattern$/) utilizza il motore di espressione regolare per valutare se le stringhe sono identiche, mentre ($a eq 'pattern') è il test di uguaglianza di stringa semplice.

Se davvero desidera solo sapere se due stringhe sono identiche, quest'ultimo è preferito per ragioni di:

  • Leggibilità - E 'più concisa, che contiene un minor numero di caratteri speciali.
  • Manutenibilità - Con un modello regolare, è necessario sfuggire a qualsiasi carattere speciale che potrebbe apparire nella stringa oppure utilizzare marcatori extra come \Q e \E. Con una stringa a virgolette singole, l'unico carattere che devi sfuggire è una citazione singola. (È anche per sfuggire backslash se sono seguiti da un altro backslash o il delimitatore di stringa.)
  • Prestazioni - Tu non incorrere l'overhead di sparare il motore regex solo per confrontare una stringa. Se questo accade diverse volte nel tuo programma, ad esempio, il vantaggio è notevole.

D'altra parte, il modulo di espressione regolare è molto più flessibile, se avete bisogno di fare qualcosa di altro di un test di uguaglianza stringa di pianura. Vedi perldoc perlre per ulteriori informazioni sulle espressioni regolari.

EDIT: Come la maggior parte tutti gli altri prima di ysth, ho perso l'ovvia differenza funzionale tra di loro e sono andato dritto per le differenze più astratte. Ho chiarito la domanda ma lascerò la risposta come riferimento (si spera) utile.

2

=~ è l'operatore vincolante. Viene utilizzato per associare un valore a una corrispondenza di modello (m//), una sostituzione (s///) o una traslitterazione (tr// o y//).

eq è l'operatore di uguaglianza stringa; confronta due valori per determinare se sono uguali se considerati come stringhe. C'è un operatore pari a == che fa la stessa cosa considerando solo i valori come numeri. (In Perl, stringhe e numeri sono per lo più intercambiabili con le conversioni che avvengono automaticamente a seconda di come vengono utilizzati i valori. Per questo, quando si desidera confrontare due valori è necessario specificare il tipo di confronto da eseguire.)

In generale , $var =~ m/.../ determina se il valore di $var corrisponde o meno a un modello, non se è uguale a un valore particolare. Tuttavia, in questo caso il pattern è ancorato ad entrambe le estremità e non contiene nient'altro che caratteri letterali, quindi è equivalente a un confronto tra stringhe. È meglio usare eq qui perché è più chiaro e veloce.

Problemi correlati