Controllate le seguenti tre condizioni:
- Non ci devono essere spazi dopo <<.
- Deve (probabilmente) esserci un punto e virgola alla fine.
- Non potete (agevolmente) inserire alcuno spazio davanti all'etichetta.
Se desiderate incolonnare il testo negli here document, potete fare
così:
# tutto in uno
($VAR = <<HERE_FINE) =~ s/^\s+//gm;
il vostro testo
va inserito qui
HERE_FINE
Ma la HERE_FINE deve comunque trovarsi al margine. Se desiderate che
anch'essa sia incolonnata, dovete mettere tra apici anche l'incolonnamento:
[la citazione è dal Signore degli Anelli, e si trova effettivamente
nei sorgenti di perl, NdT]
($citazione = <<' FINIS') =~ s/\s+//gm;
...we will have peace, when you and all your works have
perished--and the works of your dark master to whom you
would deliver us. You are a liar, Saruman, and a corrupter
of men's hearts. --Theoden in /usr/src/perl/taint.c
FINIS
$citazione =~ s/\s+--/\n--/;
Di seguito è riportata una funzione generale di ripulitura per gli here document
incolonnati. Essa si aspetta di ricevere uno here document come argomento.
Essa controlla che ciascuna linea inizi con una determinata sottostringa e,
nel caso, la rimuove. Altrimenti, prende il numero di spazi bianchi all'inizio della
prima riga e rimuove tale numero di caratteri da ciascuna delle linee successive.
sub pulisci {
local $_ = shift;
my ($bianco, $inizio); # spazio bianco comune e stringa iniziale comune
if (/^\s*(?:([^\w\s]+)(\s*).*\n)(?:\s*\1\2?.*\n)+$/) {
($bianco, $inizio) = ($2, quotemeta($1));
} else {
($bianco, $inizio) = (/^(\s+)/, '');
}
s/^\s*?$inizio(?:$bianco)?//gm;
return $_;
}
Questa soluzione funziona con stringhe particolari all'inizio,
che vengono determinate dinamicamente:
$ricorda_il_main = pulisci<<' MAIN_INTERPRETER_LOOP';
@@@ int
@@@ runops() {
@@@ SAVEI32(runlevel);
@@@ runlevel++;
@@@ while ( op = (*op->op_ppaddr)() );
@@@ TAINT_NOT;
@@@ return 0;
@@@ }
MAIN_INTERPRETER_LOOP
Oppure con uno spazio iniziale fisso, preservando il restante
incolonnamento:
[la citazione è tratta dal Signore degli Anelli, e si trova effettivamente
nei sorgenti di perl, NdT]
$poesia = pulisci<<EVER_ON_AND_ON;
Now far ahead the Road has gone,
And I must follow, if I can,
Pursuing it with eager feet,
Until it joins some larger way
Where many paths and errands meet.
And whither then? I cannot say.
--Bilbo in /usr/src/perl/pp_ctl.c
EVER_ON_AND_ON
|