Pergunta

Perl6/rakudo tem algo equivalente a perl5's __DATA__ ou __END__ Seções?

Foi útil?

Solução

Citar S26:

Nomeados blocos de perlDoc cujo tipo de tipo é os dados são o equivalente Perl 6 do Perl 5 __DATA__ seção. A diferença é que = blocos de dados são apenas blocos regulares de pod e podem aparecer em qualquer lugar dentro de um arquivo de origem e quantas vezes o necessário. Sinopse 2Descreve a nova interface Perl 6 para dados embutidos.

Em teoria, você deve ser capaz de fazer algo assim (alguém, por favor, corrija a sintaxe, se estiver desativada):

use v6;

=begin DATA
Foo
=end DATA

say @=DATA;

Na prática parece Que Rakudo ainda não apóia isso.

Outras dicas

Para citar cuidadosamente seletivamente a corrente S02 Documento de design:

Não há mais nenhum fluxo de dados especial-qualquer bloco de pod no arquivo atual pode ser acessado através de um objeto de pod ...

Você tem que dividir o conteúdo [bloco de pod] em linhas.

Especulativo] Também pode ser possível tratar um objeto POD como um identificador IO ::, ler a linha de informações da POD (como o Data FileHandle no Perl 5, mas para qualquer bloco de pod).

Então, em vez do único DADOS Seção por arquivo que você acessa lendo um FileHandle, você define qualquer número de blocos de pod no seu arquivo de script; Eles são armazenados no $=pod variável no tempo de compilação; Você leu dessa variável; e os chamados 'dados' são os equivalentes de Perl 5's DADOS.

Isso funciona hoje. Vou mostrar isso em um momento. Mas primeiro eu preciso falar sobre coisas que não funcionam hoje.

A citação acima foi altamente seletiva. O texto eliminado falou sobre o P6 criando automaticamente uma variável com um nome do formulário $=foo correspondente a blocos de pod com o nome 'Foo'. Este é um recurso geral ainda não implementado dos blocos de pod, não apenas os blocos de dados.

A seção "Bloqueio de dados" do Doc do Design de Pod S26 fala sobre blocos de dados fazendo algumas coisas mais sofisticadas do que blocos antigos simples. Isso ainda não foi implementado.

Então, agora vamos para o que pode ser feito hoje:

=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);

Isso impressa:

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

Então, isso meio que funciona. Mas claramente precisa de muito mais açúcar.

A propósito, se a última linha de estilo FP não fazia sentido, aqui está um equivalente imperativo:

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

Como subida até que isso seja totalmente implementado, você pode usar o Heredocs.

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

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

Saídas

Foo, bar, baz
1, 2, 3

Para obter uma variedade de dados, enquanto coloca os dados na parte inferior do programa para ajudar na legibilidade, aqui está uma variação do @Christopher Bottoms Responder:

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
         )
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top