ProgramaciónDesarrollador Perl

Cuéntame cómo ocurre la interpolación de arrays, hashes y scalars en Perl en diferentes tipos de cadenas, así como los peligros asociados con este mecanismo.

Supere entrevistas con el asistente de IA Hintsage

Respuesta

En Perl se admite la interpolación (sustitución de variables) en comillas dobles ("") y en ciertos herederos (por ejemplo, heredoc). Los scalars se interpolan simplemente:

my $name = 'Bob'; print "Hello, $name! "; # Hello, Bob!

Los arrays en comillas dobles se convierten en una cadena, donde los elementos están separados por el símbolo $" (por defecto, un espacio):

my @items = ('a','b','c'); print "List: @items "; # List: a b c

Los hashes se sustituyen como una cadena de clave=>valor, separados por el símbolo $;

my %h = (x => 1, y => 2); print "Hash: %h "; # Hash: x1y2 (puede variar)

En comillas simples (' ') nada se interpola — la cadena se imprime tal cual.

También es posible aplicar expresiones complejas para la interpolación a través de llaves:

print "${name}_test "; # Bob_test

El peligro es la interpolación accidental de caracteres especiales y la diferencia de comportamiento entre arrays, hashes y scalars.


Pregunta trampa

¿Por qué la cadena "Total: $total$val" a veces no funciona correctamente?

Respuesta común: "¡Todo se sustituye tal cual!"

Respuesta correcta:

La cadena "Total: $total$val" puede sustituir correctamente solo la variable $total, la variable $val puede no ser reconocida o Perl puede interpolar un rango incorrecto si los nombres de las variables son similares. Para evitar ambigüedades, use llaves:

print "Total: ${total}${val} ";

Historia


Historia 1

En los informes, la cadena de suma se veía así: "Total: $sum руб.". Después de añadir la variable $rub en el código, la cadena se convirtió en "Total: $sum$rub", por lo que la interpolación funcionó solo para $sum$, mientras que $rub fue omitida, y aparecieron advertencias. Nadie entendió hasta que vieron la cadena vacía en la salida.


Historia 2

Al formar una consulta SQL, se utilizó la interpolación de un array a través de @values sin join: "IN (@values)". Esto llevó a una cadena con espacio como separador en lugar de la lista esperada con comas. Resultado: un error en SQL y selección incorrecta.


Historia 3

Para imprimir la lista de claves de un hash, se usó %h en la cadena: "Keys: %h". Como resultado, se obtuvo una cadena aplastada de clave-valor, en lugar de una buena lista de claves. Debía hacerse: join ", ", keys %h.