Bienvenido a los foros de Perl en Español, diazmunio.
Por lo que parece, has intentado "escapar" la función de '?' dentro de una cadena de caracteres.
Como regla general, no es necesario hacerlo.
Ahora bien, otra cosa es que esa cadena la vayamos a usar después como una expresión regular (o parte de).
Entonces, sí que es necesario hacer las correspondientes transformaciones a una expr. reg., y escapar el significado especial de '?'.
Ahora bien... hay que tener cuidado...
Primer ejemplo. Esto no funciona:
Using perl Syntax Highlighting
my $linea = 'esta sí, o esta no, ¿ o no ? ';
my $cadena = "o no \?";
print "[$cadena]\n"; # imprime "[o no ?]"
if ($linea =~ /\s($cadena)\s/)
{
print "[$1]\n"; # imprime "[o no]"
}Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
es debido a que las comillas dobles provocan una interpolación de los caracteres que encierran, antes de hacer la asignación. Como hay una contrabarra delante del \? provoca que $cadena contenga 'o no ?'. La contrabarra filtra el posible carácter extraño que le sigue. Como lo que sigue es un carácter normal ('?' lo es), entonces, queda como está. Pero la barra desaparece. Fíjate en el primer print() cómo ha desaparecido.
Una solución es... evitar la interpolación, decir que la cadena de caracteres es tal cual la ponemos:
Using perl Syntax Highlighting
my $linea = 'esta sí, o esta no, ¿ o no ? ';
my $cadena = 'o no \?';
print "[$cadena]\n"; # imprime "[o no \?]"
if ($linea =~ /\s($cadena)\s/)
{
print "[$1]\n"; # imprime "[o no ?]"
}Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Y ya funciona, porque la contrabarra llega sin problemas a la expr. reg., haciendo que "escape" el significado especial de un '?', y tratándolo como un carácter normal. Por eso es capaz de capturar el trozo de texto de la $linea.
Otra forma... asegurarnos de que la cadena de caracteres que le pasamos a la expr. reg. no contiene caracteres especiales.
Using perl Syntax Highlighting
my $linea = 'esta sí, o esta no, ¿ o no ? ';
my $cadena = "o no ?";
print "[$cadena]\n"; # imprime "[o no ?]"
if ($linea =~ /\s(\Q$cadena\E)\s/)
{
print "[$1]\n"; # imprime "[o no ?]"
}Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Con los caracteres especiales '\Q' y '\E' embutimos a $cadena, haciendo que todo carácter especial sea escapado. Esto tiene ventajas e inconvenientes: La ventaja es que no tenemos, nosotros, que acordarnos de escapar esos caracteres (mira el primer print()). Y la desventaja es que no podremos crear una verdadera exp. reg. en $cadena. Solo podremos tener ahí una cadena de caracteres. Si ponemos, por ejemplo, '[no]' para indicar que queremos buscar cualquier carácter 'n' u 'o', el efecto de '\Q' y '\E' será la de "escapar" a los corchetes, porque, en efecto, son especiales para una exp. reg.
Otra forma... decir, simple y claramente que estamos construyendo una exp. reg.
Using perl Syntax Highlighting
my $linea = 'esta sí, o esta no, ¿ o no ? ';
my $cadena = qr(o
no \
?);
print "[$cadena]\n"; # imprime "(?-xism:o no \?)"
if ($linea =~ /\s(\Q$cadena\E)\s/)
{
print "[$1]\n"; # imprime "[o no ?]"
}Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
El operador qr() transforma lo que contiene a una exp. reg. En este caso sí que tenemos que acordarnos de escapar a '?' porque lo estamos buscando de forma literal. Pero el refuerzo visual lo tenemos con la presencia de qr(): estamos ahora seguros que la razón de escapar a '?' es debido a que estamos construyendo una exp. reg.
Formas, hay muchas... elige la que te parezca más clara (visual y/o conceptualmente).