Entiendo que perl tiene mucha sintaxis inusual, pero ese otro día me encontré con un fragmento de código en el trabajo que me dejó confuso. ¿Podría alguien explicarme qué significa:
<<'m'=~m>>
print $a unless $b;
return;
m
;
Se parece a la sintaxis de HEREDOC, pero no en ninguna forma que haya visto.
Respuestas:
Esta sintaxis secreta se conoce como la ornamentada espada de doble filo , y normalmente se denota como:
<<m=~m>> Comments here m ;
Es un truco para comentarios de varias líneas, haciendo uso de la sintaxis heredoc y el operador de coincidencia (
=~
) con>
como delimitador.Tenga en cuenta que, dado que las barras inclinadas,
/
no se utilizan como delimitador para la coincidencia, el operador 'm' es obligatorio. Por ejemplo,$my_var =~ /test/
es equivalente a$my_var =~ m>test>
, mientras$my_var =~ >test>
que sería inválido.Prestar atención al hecho de que el primer
m
carácter en el fragmento está encerrado por comillas simples, es decir, el$a
y$b
no va a ser interpolado variables. 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 se interpolaría cualquier variable posterior. Esto causaría problemas si$a
y$b
ya no están definidos y estás usandouse warnings;
.Para hacer que el ejemplo de la doble hoja adornado de arriba sea más fácil de entender (pero aún no recomendado), podríamos escribir:
<<"END" =~ // Comments here END ;
Tenga en cuenta que
=~ //
es redundante, por lo que equivale a:<<"END"; Comments here END
Que es solo la sintaxis estándar de heredoc en contexto vacío.
No recomendaría usar esto en el código de producción, ya que tener una cadena en un contexto vacío puede causar problemas. Además, este código es un raspador de cabezas incluso para los programadores de 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 ciña al pod como se explica aquí. ¿Cómo ingreso un comentario de varias líneas en Perl?
Espero que esto lo aclare.
fuente
Ejecutar B :: Deparse ayuda mucho para entender cómo perl está manejando ese fragmento de código (asumiendo que está en el archivo "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"
fuente