2009-09-17 23 views

Respuesta

3

"patrón de \ n" :)

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

Tal vez significaba/^ patrón de \ z /.

+0

Jepp, a la derecha - esta era la solución - era solo una pequeña pregunta en mi lugar de trabajo - No soy un codificador de back-end, pero tenía curiosidad - la aceptación del espacio en blanco fue la diferencia :) – user150283

+0

@chronotype: no espacios en blanco en general; específicamente, una nueva línea individual ("patrón \ n \ n" o "patrón \ t" no coincidiría). $ (sin/m) coincide con el final de la cadena o justo antes de una nueva línea al final de la cadena. – ysth

24

eq es por la igualdad sarta de pruebas, == es lo mismo pero por la igualdad numérica. El operador =~ es para aplicar una expresión regular a un escalar.

Para los detalles sangrientos de cada operador de Perl y para qué sirven, consulte la página de manual de perldoc perlop.

+2

Además de 'perldoc perlop', puede ver' perlopref' - un trabajo en progreso - en Github: http://github.com/cowens/perlopref – Telemachus

6

eq - Pruebas para igualdad de cuerdas.

=~ - Vincula una expresión escalar a una coincidencia de patrón.

Consulte here para obtener descripciones más detalladas de todos los operadores.

15

Como han notado otros, ($a =~ /^pattern$/) usa el motor de expresiones regulares para evaluar si las cadenas son idénticas, mientras que ($a eq 'pattern') es la prueba de igualdad de cadenas simples.

Si realmente sólo quiere saber si dos cadenas son idénticas, esta última se prefiere por razones de:

  • legibilidad - Es más concisa, que contiene menos caracteres especiales.
  • mantenibilidad - Con un patrón de expresión, que debe escapar caracteres especiales que pueden aparecer en la cadena, o utilizar marcadores adicionales, tales como \Q y \E. Con una cadena de una sola cita, el único carácter que necesita para escapar es una comilla simple. (También tiene que escapar las barras invertidas si son seguidos por otro barra invertida o delimitador de serie.)
  • Rendimiento - Usted no incurrir en los gastos generales de disparar el motor de expresiones regulares sólo para comparar una cadena. Si esto sucede varios millones de veces en su programa, por ejemplo, el beneficio es notable.

Por otro lado, la forma de expresiones regulares es mucho más flexible si necesita hacer algo otra que una prueba de igualdad de cadenas sin formato. Consulte perldoc perlre para obtener más información sobre expresiones regulares.

EDIT: Al igual que casi todos los demás antes de ysth, que se perdió la obvia diferencia funcional entre ellos y se fue directo a las diferencias más abstractos. He aclarado la pregunta, pero dejaré la respuesta como una (útil) referencia.

2

=~ es el operador vinculante. Se utiliza para vincular un valor a una coincidencia de patrón (m//), una sustitución (s///) o una transliteración (tr// o y//).

eq es el operador de igualdad de cadenas; Compara dos valores para determinar si son iguales o no cuando se consideran cadenas. Hay un operador == que hace lo mismo solo teniendo en cuenta los valores como números. (En Perl, las cadenas y los números son en su mayoría intercambiables con conversiones que suceden automáticamente dependiendo de cómo se usan los valores. Por eso, cuando desee comparar dos valores, debe especificar el tipo de comparación para realizar).

En general , $var =~ m/.../ determina si el valor de $var coincide o no con un patrón, no si es igual a un valor particular. Sin embargo, en este caso el patrón está anclado en ambos extremos y no contiene más que caracteres literales, por lo que es equivalente a una comparación de cadenas. Es mejor usar eq aquí porque es más claro y más rápido.

Cuestiones relacionadas