strawberry - perl tutorial
¿Qué significa la sintaxis<< ''m''=~ m>> en perl? (2)
Ejecutar B::Deparse ayuda mucho para comprender cómo Perl está manejando ese fragmento de código (suponiendo que esté en el archivo "test.pl"):
perl -MO=Deparse test.pl
muéstranos:
"print /$a unless /$b;/nreturn;/n" =~ //;
test.pl syntax OK
Entonces, como puede ver, Perl está tratando de hacer coincidir una expresión regular vacía con esta cadena:
"print /$a unless /$b;/nreturn;/n"
Así que entiendo que Perl tiene una sintaxis muy inusual, pero ese otro día me encontré con un fragmento de código en el trabajo que me dejó confundido. ¿Podría alguien explicarme qué significa?
<<''m''=~m>>
print $a unless $b;
return;
m
;
Parece la sintaxis de HEREDOC, pero no en ninguna forma que haya visto.
Esta sintaxis secreta se conoce como la espada de doble filo adornada , y generalmente se denota como:
<<m=~m>>
Comments here
m
;
Es un truco para comentarios de varias líneas, haciendo uso de la sintaxis y el operador de coincidencia
heredoc
(
=~
) con
>
como delimitador.
Tenga en cuenta que, como las barras inclinadas,
/
, no se utilizan como delimitador para la coincidencia, se requiere el operador ''m''.
Por ejemplo,
$my_var =~ /test/
es equivalente a
$my_var =~ m>test>
, mientras que
$my_var =~ >test>
no sería válido.
Presta atención al hecho de que el primer carácter
m
en tu fragmento está entre comillas simples, lo que significa que las variables
$b
no se interpolarán.
Si se hubieran omitido estas comillas (según mi ejemplo de código proporcionado), Perl agregaría automáticamente comillas dobles al marcador final y las variables posteriores se interpolarían.
Esto causaría problemas si
$a
y
$b
ya no están definidos y está utilizando
use warnings;
.
Para que el ejemplo anterior de doble hoja adornado sea más fácil de entender (pero aún no se recomienda), podríamos escribir:
<<"END" =~ //
Comments here
END
;
Tenga en cuenta que
=~ //
es redundante, por lo que esto es equivalente a:
<<"END";
Comments here
END
Que es la sintaxis estándar heredoc en contexto vacío.
No recomendaría usar esto en el código de producción ya que tener una cadena en contexto vacío puede causar problemas. Además, este código es un rascador de cabeza incluso para los programadores perl más experimentados y es inútilmente difícil de leer y mantener. Si desea crear comentarios de varias líneas adecuados, le sugiero que se adhiera al pod como se explica aquí. ¿Cómo ingreso un comentario de varias líneas en Perl?
Espero que esto lo aclare.