Domanda

non perl6 / Rakudo hanno qualcosa equivalente a __DATA__ o __END__ sezioni di Perl5?

È stato utile?

Soluzione

S26 :

  

blocchi perldoc denominato il cui typename è   I dati sono il Perl 6 equivalente del   Perl 5 sezione __DATA__. Il   = differenza è che i blocchi di dati sono   blocchi appena regolari Pod e può apparire   ovunque all'interno di un file di origine, e come   tante volte quanto richiesto. Sinossi 2   descrive la nuova interfaccia Perl 6 per   dati in linea.

In teoria si dovrebbe essere in grado di fare qualcosa di simile (qualcuno si prega di correggere la sintassi se è spento):

use v6;

=begin DATA
Foo
=end DATA

say @=DATA;

In pratica sembra che Rakudo non supporta che, ancora.

Altri suggerimenti

Per attentamente selettivamente citare la S02 documento di progetto:

  

Non è più alcun flusso di dati speciale - qualsiasi blocco Pod nel   file corrente si può accedere tramite un oggetto Pod ...

     

Devi scissione [Pod blocco] contenuto in linee di te stesso.

     

[speculativo] Può anche essere possibile trattare un oggetto come un baccello   IO :: Handle, per leggere le informazioni Pod linea per linea (come la DATA   filehandle in Perl 5, ma per qualsiasi blocco Pod).

Così, invece del singolo dati per ogni file a cui si accede con la lettura di un filehandle, è possibile definire un numero qualsiasi di blocchi Pod nel file di script; questi sono memorizzati nella variabile $=pod al momento della compilazione; si legge da quella variabile; e quelli chiamati 'Dati' sono gli equivalenti di Perl 5 di dati .

Questo funziona oggi. Ti faccio vedere che in un attimo. Ma prima ho bisogno di parlare di cose che non funziona oggi.

La citazione di cui sopra è stato altamente selettivo. Il testo elisa parlato P6 creare automaticamente una variabile con un nome del modulo $=foo corrispondente ai blocchi Pod con il nome di 'foo'. Questa è una caratteristica ancora non attuata generale dei blocchi Pod, non solo i blocchi di dati.

La sezione "blocco dati" del progetto doc Pod S26 parla di blocchi di dati fare alcune cose più elaborato rispetto blocchi semplici vecchi Pod. Questo non è ancora stato implementato sia.

Così, ora passiamo a ciò che può essere fatto oggi:

=foo This is a Pod block. A single line one. This Pod block's name is 'foo'.

=begin qux
This is another syntax for defining a Pod block.
It allows for multi line content.
This block's name is 'qux'.
=end qux

=data A data block -- a Pod block with the name 'data'.

# Data blocks are P6's version of P5's __DATA__.
# But you can have multiple data blocks:

=begin data
Another data block.
This time a multi line one.
=end data

$=pod.grep(*.name eq 'data').map(*.contents[0].contents.say);

Questo stampa:

A data block -- a Pod block with the name 'data'.
Another data block. This time a multi line one.

Quindi, è sorta opere. Ma ha chiaramente bisogno di molto di più di zucchero.

A proposito, se l'ultima riga stile FP non ha senso, ecco un imperativo equivalente:

for @$=pod {
  if .name eq 'data' {
    say .contents[0].contents
  }
};

Come un work-around fino a quando questo viene pienamente attuato, è possibile utilizzare heredocs.

for data().lines -> $line {
    put $line;
}

sub data {
    return q:to/END/;
           Foo, bar, baz
           1, 2, 3
           END
}

Uscite

Foo, bar, baz
1, 2, 3

Per ottenere un array di dati, mettendo i dati in fondo al programma di aiuto con la leggibilità, qui è una variazione di @Christopher Bottoms risposta:

my @txts = data();
dd @txts;
# this works too
my %stuff = hashdata();
dd %stuff;

# a lot of lines

sub data() {
    return ( q:to/LINE1/,
        Phasellus dictum, nunc id vestibulum rhoncus, mauris massa tempus nibh, 
        nec tincidunt nisi tellus et arcu. Phasellus vulputate consectetur
        vulputate. Quisque viverra commodo velit ac tincidunt. Nulla et est sem.
        Mauris gravida, nulla rutrum pharetra dapibus, eros velit feugiat nibh,
        nec iaculis purus urna ut diam. Praesent molestie felis a turpis gravida
        placerat. Duis sagittis pulvinar risus non aliquet. Nunc quis purus
        tempor, mattis nunc eu, porta ligula. Suspendisse dictum sit amet urna
        dapibus suscipit.  
        LINE1  
        q:to/LINE2/,  
        Praesent molestie felis a turpis gravida
        placerat. Duis sagittis pulvinar risus non aliquet. Nunc quis purus
        tempor, mattis nunc eu, porta ligula. Suspendisse dictum sit amet urna
        dapibus suscipit.
        LINE2
        q:to/LINE3/);
        Quisque viverra commodo velit ac tincidunt. Nulla et est sem.
        Mauris gravida, nulla rutrum pharetra dapibus, eros velit feugiat nibh,
        nec iaculis purus urna ut diam. Praesent molestie felis a turpis gravida
        placerat.
        LINE3
}

sub hashdata() { # a hash works too.
      return ( 'p' => q:to/PDATA/,
        Some multiline data
        in some lines
        PDATA

        'q' => q:to/QDATA/,
           More data in 
           multiple lines
           QDATA

         'r' => q:to/RDATA/
              Note that indentation depends on the position of the 
              ending token.
              Also, the punctuation following the regex is the punctuation
              following the expression. So a comma after each of the 
              p and q, but not needed after the r
              RDATA
         )
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top