Wie deaktiviere ich die Option "show_tied" des Perl 5-Moduls Data :: Printer, wenn ich es in Raku verwende?

8

Ich habe das CPAN Perl-Modul Data :: Printer (DP) mit Perl verwendet. Es funktioniert großartig.

Jetzt möchte ich es im Raku-Code verwenden.

Wenn ich die :from<Perl5>Funktion zum Importieren verwende und dann Code damit ausführe, wird die Anmerkung (tied to Perl6::Hash)an die Anzeige von Hashes angehängt. 1

Wie das CPAN-Dokument von DP zeigt, wird diese Anmerkung durch die Option gesteuert show_tied. Ich möchte es schalten ab (stellen Sie ihn auf 0) anstelle des Standard auf (auf 1). So würde ich das in Perl machen:

use Data::Printer show_tied => 0;

Aber wenn ich das in Raku versuche:

use Data::Printer:from<Perl5> show_tied => 0;

Ich bekomme:

Fehler beim Importieren von 'Data :: Printer': Kein solches Tag 'show_tied'

Wie schalte ich show_tiedaus, wenn ich DP in Raku verwende?

Fußnoten

1 Vielleicht liegt dies daran, dass Inline :: Perl5 (das die :from<Perl5>Funktion implementiert ) etwas unternimmt, um ein reibungsloses Perl / Raku-Interop zu ermöglichen.

Raiph
quelle

Antworten:

6

Wie schalte ich show_tiedaus, wenn ich DP in Raku verwende?

Sie müssen Associatives (z. B. Pairs), die am Ende einer useAnweisung aufgeführt sind und keine "Tags" sind, explizit in eine reduzierte Liste konvertieren, die Schlüssel und Werte verschachtelt. 1

Die direkteste Lösung besteht darin, manuell eine flache Liste von Literalen zu schreiben, z.

use Data::Printer:from<Perl5> 'show_tied', 0;

Eine übersichtlichere Lösung finden Sie im Abschnitt Verwendenkv unten.

Injizieren von Variablen

Beachten Sie, dass useAnweisungen zur Kompilierungszeit ausgewertet werden . Wenn Sie also Variablen in die Liste einfügen möchten, müssen Sie sicherstellen, dass ihre Werte und nicht nur ihre Namen zur Kompilierungszeit festgelegt werden , bevor die useAnweisung ausgewertet wird. Ein schmuckloses my $foo = 0;Produkt reicht nicht aus, da das = 0Teil zur Laufzeit ausgeführt wird . Stattdessen müssen Sie ein geeignetes Kompilierung-Konstrukt verwenden , wie zum Beispiel BEGIN:

BEGIN my $foo = 0;
use Data::Printer:from<Perl5> 'show_tied', $foo;

Verwenden von kv

Die kvRoutine kann die gewünschte 'key1', value1, 'key2', value2, ...Sequenz mit einem Hash erzeugen :

use Data::Printer:from<Perl5> kv { show_tied => 0 }

oder:

BEGIN my %opts = show_tied => 0;
use Data::Printer:from<Perl5> kv %opts;

Fußnoten

1 Diese Antwort basiert auf Stefans Erklärung aus dem Problem, das ich als Antwort auf die "Ändern von Parametern in Data :: Printer in Raku" SO :

Die Lösung ist ziemlich einfach: Verwendung Data::Printer:from<Perl5> 'show_tied', 0;Das Fettkomma =>ist ein PairKonstruktor in Raku, während es in Perl 5 eigentlich nur ein ausgefallenes Komma ist. Raku betrachtet PairArgumente als zum Importieren von Tags wie :ALL(was äquivalent zu ist ALL => True). Um dies zu umgehen und den erwarteten Perl 5-Code zu übergeben, listen Sie die Werte einfach einzeln auf.

Mit anderen Worten, dies ist notwendig für die Konvertierung , weil Perl und Raku der Anteil Vorstellung von Tags ( Perl doc über „Tags“ , Raku doc über „Tags“ ) und (nicht zufällig) idiomatisch die gleiche Syntax für die Auswahl - Tags ( :tagname).

Bei Verwendung von Raku gilt dieses Problem der (zu lösenden) Mehrdeutigkeit zwischen der Verwendung der Syntax zur Angabe von Tags und nicht für alle Associative s, die in der obersten Ebene einer useAnweisung verwendet werden, nicht nur für diejenigen, die in der Form geschrieben wurden, :foosondern auch für diejenigen, die geschrieben wurden in anderen Formen wie zum Beispiel foo => bar, { foo => bar}, %baz, oder { %baz }.

Raiph
quelle
Diese 3 Lösungen funktionieren angesichts des Testbeispiels , das ich stackoverflow.com/questions/55799219/… gegeben habe, nicht. Es zeigt immer noch die falsche Ausgabe mit allen schrecklichen varVariablen. Es sieht nicht so aus, als ob dieses Paket sogar in Raku funktioniert. Es ist eine Schande, in Perl es funktioniert wunderbar: (
con
Hallo @con. 1 Es funktioniert bei mir. Siehe meine Kopie Ihres Testskripts, Details des Systems, auf dem ich es ausführe, und die Ausgabe, die es erzeugt . 2 Wenn ich Varianten Ihres Testskripts gemäß den Anweisungen in dieser SO ausführe, funktionieren sie auch ordnungsgemäß und schalten die DP-Optionen wie erwartet ein / aus. 3 Diese Ergebnisse sind für mich, HåkonHægland und Stefan (IP5-Autor) im Wesentlichen gleich. 4 Ich denke, Data :: Printer funktioniert in Raku und diese SO ist korrekt. 5 Wenn Sie Ihr Problem weiter diskutieren möchten, kommentieren Sie bitte meine Antwort auf Ihre vorherige SO. TIA.
Raiph