Hat perl6/Rakudo etwas, das den Abschnitten __DATA__
oder __END__
von perl5 entspricht?Unterstützt Perl6 etwas, das den Abschnitten __DATA__ und __END__ von Perl5 entspricht?
Antwort
Quote S26:
Named Perldoc Blöcke, deren Typname ist Daten sind die Perl 6 Äquivalent der Perl 5
__DATA__
Abschnitt. Der Unterschied ist, dass = DATA Blöcke sind nur regelmäßige Pod-Blöcke und möglicherweise irgendwo innerhalb einer Quelldatei und als viele Male wie erforderlich. Synopsis 2 beschreibt die neue Perl 6-Schnittstelle für Inline-Daten.
In der Theorie sollten Sie in der Lage sein, so etwas zu tun (jemand reparieren Sie bitte die Syntax, wenn es ausgeschaltet ist):
use v6;
=begin DATA
Foo
=end DATA
say @=DATA;
In practice it seems die Rakudo nicht unterstützt, noch nicht.
zitieren sorgfältig selektiv das aktuelle S02 Design-Dokument:
Es nicht mehr spezieller Datenstrom wird - jeder Pod Block in der aktuellen Datei kann über ein Pod-Objekt zugegriffen werden ...
Sie müssen [Pod block] Inhalte in Zeilen selbst aufteilen.
[Spekulative] Es kann auch möglich sein, ein Pod-Objekt als IO zu behandeln ::, Behandeln Sie den Pod Informationen line-by-line (wie der DATA Dateihandle in Perl 5, aber für jeden Pod-Block zu lesen).
Also, anstelle des einzelnen DATA Abschnitt pro Datei, die Sie durch das Lesen eines Dateikennung zugreifen, definieren Sie eine beliebige Anzahl von Pod Blöcke in Ihrer Script-Datei; Sie werden in der Variablen $=pod
zur Kompilierzeit gespeichert. du liest aus dieser Variablen; und diejenigen, die "Daten" genannt werden, sind die Äquivalente von Perl 5's DATA.
Dies funktioniert heute. Ich werde das gleich zeigen. Aber zuerst muss ich über Dinge reden, die heute nicht funktionieren.
Das obige Zitat war sehr selektiv. Der elierte Text sprach davon, dass P6 automatisch eine Variable mit dem Namen $=foo
erstellt, die den Pod-Blöcken mit dem Namen 'foo' entspricht. Dies ist eine allgemeine, noch nicht implementierte Eigenschaft von Pod-Blöcken, nicht nur von Datenblöcken.
Der Abschnitt "Datenblock" des Pod-Designs doc S26 spricht von Datenblöcken, die etwas schickeres tun als einfache alte Pod-Blöcke. Dies wurde auch noch nicht implementiert.
So, jetzt lassen Sie uns auf bewegen, was heute getan werden kann:
=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);
Diese Drucke:
A data block -- a Pod block with the name 'data'.
Another data block. This time a multi line one.
Also, es sorta funktioniert. Aber es braucht deutlich mehr Zucker.
By the way, wenn die letzte Zeile FP Stil keinen Sinn, hier ist ein Imperativ Äquivalent:
for @$=pod {
if .name eq 'data' {
say .contents[0].contents
}
};
Als Behelfslösung, bis diese vollständig umgesetzt wird, Sie Heredocs verwenden können.
for data().lines -> $line {
put $line;
}
sub data {
return q:to/END/;
Foo, bar, baz
1, 2, 3
END
}
Ausgänge
Foo, bar, baz 1, 2, 3
Leider Rakudo nicht implementiert sie noch. – moritz
Was Rakudo Ende 2016 unterstützt, zeigt [eine neuere Antwort auf diese Frage] (http://stackoverflow.com/a/27936867/1077672). – raiph