Does Perl6 Unterstützung etwas Gleichwertiges zu Perl5 der __DATA__ und __END__ Abschnitte?
Frage
Does Perl6 / Rakudo haben etwas Gleichwertiges zu perl5 der __DATA__
oder __END__
Abschnitte?
Lösung
S26 :
Named Perldoc Blöcke, deren Typname ist Die Daten sind die Perl 6 Äquivalent des Perl 5
__DATA__
Abschnitt. Das = Unterschied ist, dass Datenblöcke nur regelmäßige Pod Blöcke und kann angezeigt werden überall innerhalb einer Quelldatei, und als oft 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 der Praxis scheint es dass Rakudo, dass nicht unterstützt, noch.
Andere Tipps
zitieren sorgfältig selektiv die aktuellen S02 Design-Dokument:
Es ist nicht mehr spezieller Datenstrom - jeder Pod-Block in der aktuelle Datei kann über ein Pod-Objekt zugegriffen werden ...
Sie müssen Split [Pod Block] Inhalt in Zeilen selbst.
[Spekulative] Es kann auch möglich sein, ein Pod-Objekt als eine zu behandeln IO :: Handle, das Pod Informationen line-by-line (wie die Daten zu lesen Dateihandle in Perl 5, aber für jeden Pod-Block).
Also, statt die einzelnen DATA pro Datei, die Sie zugreifen, indem Sie einen Dateihandle lesen, definieren Sie eine beliebige Anzahl von Pod Blöcke in Ihrer Script-Datei; sie sind bei der Kompilierung in der $=pod
Variable gespeichert; Sie lesen aus diesen Variablen; und diejenigen, genannt 'Daten' sind die Äquivalente von Perl 5 DATA .
Das funktioniert heute. Ich werde das in einem Moment zeigen. Aber zuerst ich müssen reden über Dinge, die nicht funktioniert heute.
Das oben zitierte war sehr selektiv. Der elided Text gesprochen P6 automatisch eine Variable mit dem Namen der Form $=foo
Schaffung bis Pod-Blöcke mit dem Namen ‚foo‘ entspricht. Dies ist eine allgemeine noch nicht implementierte Funktion von Pod Blöcke, nicht nur Datenblöcke.
Der "Datenblock" des Pod-Design doc S26 spricht über Datenblöcke dabei einige ausgefallenere Sachen als nur alte Pod Blöcke. Dies wurde entweder noch nicht implementiert.
So, jetzt machen sie weiter zu dem, 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 Ausgabe:
A data block -- a Pod block with the name 'data'.
Another data block. This time a multi line one.
So, sorta es funktioniert. Aber es muss klar viel mehr Zucker.
Durch die Art und Weise, wenn die letzte FP Artlinie 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 werden, können Sie Heredocs verwenden.
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
Um ein Array von Daten zu erhalten, während der Daten am unteren Rande des Programms, um Hilfe mit Ablesbarkeit setzen, hier ist eine Variation von @Christopher Bottoms Antwort:
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
)
}