ProgrammazioneSviluppatore Perl

Parlami di come avviene l'interpolazione di array, hash e scalari in diverse tipologie di stringhe in Perl, e quali pericoli sono associati a questo meccanismo.

Supera i colloqui con l'assistente IA Hintsage

Risposta

In Perl viene supportata l'interpolazione (sostituzione delle variabili) tra virgolette doppie ("") e in determinati modelli (ad esempio, heredoc). Gli scalari vengono interpolati semplicemente:

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

Gli array tra virgolette doppie vengono convertiti in una stringa, dove gli elementi sono separati dal carattere $" (di default è uno spazio):

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

Gli hash vengono sostituiti come stringa chiave=>valore, separati dal carattere $;

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

Tra virgolette singole (' ') niente viene interpolato — la stringa viene stampata letteralmente.

È anche possibile applicare espressioni complesse per l'interpolazione tramite parentesi graffe:

print "${name}_test "; # Bob_test

Il pericolo — l'interpolazione accidentale di caratteri speciali e la differenza nel comportamento di array, hash e scalari.


Domanda trabocchetto

Perché la stringa "Total: $total$val" a volte non funziona correttamente?

Risposta comune: "Tutto viene sostituito così com'è!"

Risposta corretta:

La stringa "Total: $total$val" può sostituire correttamente solo la variabile $total, la variabile $val potrebbe non essere riconosciuta oppure Perl potrebbe interpolare un intervallo errato, se i nomi delle variabili sono simili. Per evitare ambiguità, utilizzare le parentesi graffe:

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

Storia


Storia 1

Nei report, la stringa del totale appariva così: "Totale: $sum rub.". Dopo l'aggiunta della variabile $rub nel codice, la stringa divenne "Totale: $sum$rub", il che portò all'interpolazione solo per $sum$, mentre $rub venne saltata, scatenando avvisi. Nessuno capì fino a quando non videro una stringa vuota nell'output.


Storia 2

Nella creazione di una query SQL, l'interpolazione dell'array attraverso @values veniva utilizzata senza join: "IN (@values)". Questo portava a una stringa con uno spazio come delimitatore invece dell'atteso elenco separato da virgole. Risultato — errore in SQL e selezione errata.


Storia 3

Per stampare l'elenco delle chiavi di un hash si utilizzava %h nella stringa: "Keys: %h". Così otteneva una stringa unita chiave-valore, invece di un buon elenco di chiavi. Si doveva fare: join ", ", keys %h.