-+  Associazione
-+  Documenti
 |-  Modern Perl
 |-  Bibliografia
 |-  Articoli
 |-  Talk
 |-  Perlfunc
 |-  F.A.Q.
 |-  F.A.Q. iclp
-+  Eventi
-+  Community
-+  Blog
-+  Link
Corso di Perl



 


indietro

[38] Come mai i miei <<HERE document non funzionano?

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

vedi in inglese

AUTORE E COPYRIGHT

Copyright (c) 1997, 1998, 1999, 2000, 2001 Tom Christiansen e Nathan Torkington. Tutti i diritti riservati.

Questa documentazione è libera; puoi ridistribuirla e/o modificarla secondo gli stessi termini applicati al Perl.

Indipendentemente dalle modalitè di distribuzione, tutti gli esempi di codice in questo file sono rilasciati al pubblico dominio. Potete, e siete incoraggiati a farlo, utilizzare il presente codice o qualunque forma derivata da esso nei vostri programmi per divertimento o per profitto. Un semplice commento nel codice che dia riconoscimento alle FAQ sarebbe cortese ma non è obbligatorio.

D:
Progetti e documenti in rilievo
Corso di Perl Progetto pod2it
D:
La ML di Perl.it
mongers@perl.it è la lista ufficiale di Perl Mongers Italia per porre quesiti di tipo tecnico, per rimanere aggiornato su meeting, incontri, manifestazioni e novità su Perl.it.
Iscriviti!
D:
Annunci Google