Does Perl6 Unterstützung etwas Gleichwertiges zu Perl5 der __DATA__ und __END__ Abschnitte?

StackOverflow https://stackoverflow.com/questions/4269140

  •  28-09-2019
  •  | 
  •  

Frage

Does Perl6 / Rakudo haben etwas Gleichwertiges zu perl5 der __DATA__ oder __END__ Abschnitte?

War es hilfreich?

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
         )
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top