2010-11-24 10 views

Respuesta

11

Cita S26:

bloques perldoc con nombre cuyo nombre de tipo es de datos son el Perl 6 equivalente de la sección Perl 5 __DATA__. La diferencia es que = los bloques de DATOS son solo los bloques de Pod regulares y pueden aparecer en cualquier lugar dentro de un archivo fuente, y como muchas veces según sea necesario. Synopsis 2 describe la nueva interfaz 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; 

In practice it seems que Rakudo no admite que, sin embargo.

+3

Desafortunadamente Rakudo no implementa aún. – moritz

+1

Lo que Rakudo admite a finales de 2016 se muestra en [una respuesta más reciente a esta pregunta] (http://stackoverflow.com/a/27936867/1077672). – raiph

8

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

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

Tiene que dividir los contenidos [Pod block] en líneas usted mismo.

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

Así, en lugar de la única DATOS sección por archivo el que se accede mediante la lectura de un gestor de archivo, debe definir cualquier número de bloques de la vaina en el archivo de secuencia de comandos; se almacenan en la variable $=pod en el momento de la compilación; lees de esa variable; y los llamados "datos" son los equivalentes de Perl 5 DATA.

Esto funciona hoy. Lo mostraré en un momento. Pero primero necesito hablar sobre cosas que hoy no funcionan.

La cita anterior fue muy selectiva. El texto elided hablaba de que P6 crea automáticamente una variable con un nombre del formulario $=foo que corresponde a los bloques Pod con el nombre 'foo'. Esta es una característica general aún no implementada de los bloques Pod, no solo bloques de datos.

La sección "bloque de datos" del documento de diseño Pod S26 habla de bloques de datos que hacen algunas cosas más elegantes que los viejos bloques de Pod. Esto aún no ha sido implementado tampoco.

lo tanto, 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 funciona. Pero claramente necesita mucha más azúcar.

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

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

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 
Cuestiones relacionadas