Pregunta

¿El Perl6 / Rakudo tiene algo equivalente a secciones o __DATA__ __END__ de Perl5?

¿Fue útil?

Solución

S26 :

  

bloques perldoc con nombre cuyo nombre de tipo es   Los datos son la Perl 6 equivalente de la   Perl 5 sección __DATA__. los   = diferencia es que los bloques de datos son   Pod bloques regulares y solo puede aparecer   en cualquier lugar dentro de un archivo de origen, y como   cuantas veces sea necesario. Sinopsis 2   describe la nueva interfaz de Perl 6 para   datos en línea.

En teoría debería ser capaz de hacer algo como esto (alguien por favor corregir la sintaxis si es apagado):

use v6;

=begin DATA
Foo
=end DATA

say @=DATA;

En la práctica, parece que Rakudo no admite que, sin embargo.

Otros consejos

Para cuidadosamente citar selectivamente la corriente S02 documento de diseño:

  

Ya no hay ningún flujo de datos especial - cualquier bloque en el Pod   archivo actual se puede acceder a través de un objeto Pod ...

     

Hay que dividir [Pod bloque] contenido en líneas usted mismo.

     

[especulativa] También puede ser posible tratar un objeto Pod como una   IO :: Handle, de leer la información de la vaina, línea por línea (como los DATOS   gestor de archivo en Perl 5, pero para cualquier bloque Pod).

Así, en lugar de la única DATOS por archivo el que se accede mediante la lectura de un gestor de archivo, puede definir cualquier número de bloques de la vaina en el archivo de script; sino que están almacenados en la variable $=pod en tiempo de compilación; se lee de esa variable; y los llamados 'datos' son los equivalentes de Perl 5 de DATOS .

Esto funciona en la actualidad. Voy a mostrar que en un momento. Pero primero tengo que hablar de cosas que no funciona en la actualidad.

El citando anteriormente era altamente selectivo. El texto elided habló de P6 creación automática de una variable con un nombre de la forma correspondiente a $=foo Pod bloques con el nombre 'foo'. Esta es una característica aún no implementada general de la vaina de los bloques, no sólo los bloques de datos.

La sección "bloque de datos" del doc diseño de la vaina S26 habla de bloques de datos haciendo algunas cosas más elegante que evidentemente antiguos bloques de la vaina. Esto aún no se ha implementado ya sea.

Así que, ahora vamos a pasar a lo que se puede hacer hoy en día:

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

Esta impresora:

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

Por lo tanto, sortA obras. Pero claramente necesita mucho más azúcar.

Por cierto, si la última línea de estilo de FP no tenía sentido, aquí hay un imperativo equivalentes:

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

Como solución temporal hasta que esto se aplique plenamente, se puede usar heredocs.

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

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

Salidas

Foo, bar, baz
1, 2, 3

Para obtener una matriz de datos, mientras que poner los datos en la parte inferior del programa de ayuda para facilitar la lectura, aquí es una variación de la respuesta @Christopher Bottoms:

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top