Qual è la differenza tra questi due operatori? In particolare, quale differenza in $a
porterà a un comportamento diverso tra i due?Qual è la differenza tra 'eq' e '= ~' in Perl?
$a =~ /^pattern$/
$a eq 'pattern'
Qual è la differenza tra questi due operatori? In particolare, quale differenza in $a
porterà a un comportamento diverso tra i due?Qual è la differenza tra 'eq' e '= ~' in Perl?
$a =~ /^pattern$/
$a eq 'pattern'
"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 /.
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
@ 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
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.
Oltre a 'perldoc perlop', puoi controllare' perlopref' - un work in progress - su Github: http://github.com/cowens/perlopref – Telemachus
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.
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:
\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.)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.
=~
è 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.
Grazie per le risposte! – user150283