Est-ce que perl6/Rakudo a quelque chose d'équivalent aux sections __DATA__
ou __END__
de perl5?Est-ce que Perl6 supporte quelque chose d'équivalent aux sections __DATA__ et __END__ de Perl5?
Répondre
Quote S26:
désignés blocs de perldoc dont nomtype est données sont l'équivalent Perl 6 de la section Perl 5
__DATA__
. La différence est que = blocs de données sont juste blocs réguliers Pod et peuvent apparaître partout dans un fichier source, et que de fois que nécessaire. Synopsis 2 décrit la nouvelle interface Perl 6 pour les données en ligne .
En théorie, vous devriez être en mesure de faire quelque chose comme ça (quelqu'un s'il vous plaît corriger la syntaxe s'il est éteint):
use v6;
=begin DATA
Foo
=end DATA
say @=DATA;
In practice it seems que Rakudo ne supporte pas, encore.
Pour citer soigneusement de manière sélective le document de conception S02 actuelle:
Il n'y a plus de flux de données spécial - un bloc Pod dans le fichier en cours peut être consulté via un objet Pod ...
Vous devez diviser vous-même le contenu de [Bloc de pod] en lignes.
[Speculative] Il peut également être possible de traiter un objet Pod comme IO :: Handle, lire la ligne par ligne d'information: Pod (comme le descripteur de fichier DATA en Perl 5, mais pour un bloc Pod).
Ainsi, au lieu de la section DATA unique par fichier que vous accédez par la lecture d'un descripteur de fichier, vous définissez un certain nombre de blocs de module dans votre fichier script; ils sont stockés dans la variable $=pod
au moment de la compilation; vous lisez de cette variable; et ceux qui sont appelés « données » sont les équivalents de Perl 5 de DATA.
Cela fonctionne aujourd'hui. Je vais le montrer dans un instant. Mais d'abord je dois parler de choses qui ne fonctionnent pas aujourd'hui.
La citation ci-dessus était hautement sélective. Le texte élidé parlait de P6 créant automatiquement une variable avec un nom du formulaire $=foo
correspondant aux blocs Pod avec le nom 'foo'. C'est une caractéristique générale encore non implémentée des blocs Pod, pas seulement des blocs de données. La section «bloc de données» du document de conception de pod S26 parle de blocs de données plus sophistiqués que les anciens blocs Pod. Cela n'a pas encore été mis en œuvre non plus.
Alors, passons maintenant à ce qui peut être fait aujourd'hui:
=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);
Cette impression:
A data block -- a Pod block with the name 'data'.
Another data block. This time a multi line one.
Ainsi, il fonctionne sorta. Mais il a clairement besoin de beaucoup plus de sucre.
Par ailleurs, si la dernière ligne de style FP n'a pas de sens, ici est un équivalent impératif:
for @$=pod {
if .name eq 'data' {
say .contents[0].contents
}
};
En tant que travail autour jusqu'à ce que cela devient pleinement mis en œuvre, vous pouvez utiliser heredocs.
for data().lines -> $line {
put $line;
}
sub data {
return q:to/END/;
Foo, bar, baz
1, 2, 3
END
}
Sorties
Foo, bar, baz 1, 2, 3
Malheureusement Rakudo ne les supporte pas encore. – moritz
Ce que Rakudo prend en charge à la fin de 2016 est présenté dans [une réponse plus récente à cette question] (http://stackoverflow.com/a/27936867/1077672). – raiph