La línea
if ($sql !=~ /$and/) {es muy confusa... El patrón es una variable escalar llamada $and. No estás buscando por 'and', si no por lo que contenga la variable $and.
Como supongo que $and no la tienes declarada ni definida, estará por defecto vacía. Como no usas 'use strict', Perl no te ha podido avisar de que estás cometiendo un error sintáctico.
Entonces estás buscando la cadena vacía dentro de... ¡
$_! ya que lo que has escrito es esto:
if ( $sql != ~/$and/) {O sea, es una comparación numérica entre $sql (que se convertirá en 0, por ser una cadena que no empieza por número), con el resultado de hacer la negación binaria (~) del resultado de buscar una cadena vacía en la variable
$_... El resultado de la parte derecha es 18446744073709551615. Entonces, como 0 es distinto de 18446744073709551615, el resultado es positivo y por eso ves el mensaje de que existe.
En realidad, deberías haberlo escrito así:
if ($sql =~ /and$/i) {Ahora sí estamos aplicando el operador de coincidencia entre $sql y el patrón. Y el patrón tiene un ancha ($) que marca el final de la cadena. La opción
/i es para buscar tanto por mayúsculas como minúsculas.
Using bash Syntax Highlighting
$ perl -E '$sql = "SELECT local,eq,descrip_mantto,atend,f_inicio,f_termino FROM t_manttos tm, c_manttos cm WHERE tm.tipo_mantto=cm.tipo_mantto AND tm.local=`TM0` and"; say "Sí" if $sql =~ /and$/i '
Sí
Coloreado en 0.003 segundos, usando
GeSHi 1.0.8.4