Corso di Raku / Avanzato / Altro sui tipi predefiniti / Costrutti di quoting
Heredoc
Un heredoc è una forma di quoting per testo su più righe.
Invece di delimitatori attorno al testo, si indica una parola
terminatore con :to, e la stringa va dalla riga successiva
fino a una riga che contiene solo quella parola:
my $text = q:to/END/;
Hello,
World!
END
print $text;Questo stampa:
Hello,
World!Il terminatore (END qui — qualsiasi parola va bene)
indica dove finisce il testo. Nota il print: il testo
mantiene il carattere di nuova riga che si trova prima del terminatore,
quindi termina già con un’interruzione di riga — usare say
ne aggiungerebbe una seconda e lascerebbe una riga vuota finale. Poiché
l’heredoc inizia con q:to, il testo non viene interpolato;
usa qq:to per interpolare le variabili:
my $name = 'Anna';
my $greeting = qq:to/EOF/;
Dear $name,
Welcome!
EOF
print $greeting;Un dettaglio utile: l’indentazione del terminatore di chiusura viene rimossa da ogni riga del testo. Questo ti permette di indentare un heredoc per allinearlo al codice circostante senza che quell’indentazione finisca nella stringa:
sub greeting {
return q:to/END/;
Hello,
World!
END
}
print greeting;Questo stampa lo stesso Hello, e World! del
primo esempio. Qui il terminatore di chiusura END è
indentato di otto spazi, quindi otto spazi vengono rimossi da ogni riga,
e la stringa restituita è semplicemente Hello,\nWorld!
senza spazi iniziali.
Il terminatore di chiusura stabilisce quanto viene rimosso, quindi ogni riga del testo deve essere indentata almeno altrettanto. Se una riga ha meno spazi iniziali, Raku non può rimuovere l’intera quantità e avvisa — Asked to remove 8 spaces, but the shortest indent is 4 spaces. Mantieni il terminatore non più profondo della riga con meno indentazione per evitarlo. Gli heredoc sono la scelta naturale per template, messaggi e qualsiasi blocco di testo che si estende su più righe.
Navigazione del corso
← Quiz — Avverbi di quoting | Una stringa grezza →
💪 Oppure vai direttamente agli esercizi di questa
sezione.