¿Qué significa la sintaxis << 'm' = ~ m >> en perl?

82

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.

AliceHemp
fuente
2
posible duplicado de Comprender el extraño mecanismo de comentarios de varias líneas de Perl
Gilles 'SO- deja de ser malvado'
1
Puede acceder a una lista de constantes y operadores secretos de Perl aquí .
aloisdg se muda a codidact.com

Respuestas:

124

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 mcarácter en el fragmento está encerrado por comillas simples, es decir, el $ay $bno 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 $ay $bya no están definidos y estás usando use 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.

Hayden
fuente
24

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"):

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"

Miguel Prz
fuente