Rakuで使用する場合、Perl 5モジュールのData :: Printerの `show_tied`オプションをオフにするにはどうすればよいですか?


8

CPAN PerlモジュールData :: Printer(DP)をPerlで使用しました。それは素晴らしい働きをします。

楽コードで使いたい。

この:from<Perl5>機能を使用してインポートし、それを使用してコードを実行すると、(tied to Perl6::Hash)ハッシュの表示に注釈が追加されます。1

以下のようDPのCPANのドキュメントを示して、この注釈はオプションによって制御されていますshow_tied。デフォルトのオン(に設定)ではなく、オフ(に設定0)にしたい。Perlでこれを行う方法は次のとおりです。1

use Data::Printer show_tied => 0;

しかし、私が楽でこれを試したとき:

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

私は得ます:

「Data :: Printer」からのインポート中にエラーが発生しました:そのようなタグ「show_tied」はありません

show_tiedRakuでDPを使用する場合、どのようにオフにしますか?

脚注

1おそらくこれは、Inline :: Perl5(この:from<Perl5>機能を実装)がスムーズなPerl / Raku相互運用を可能にするために何かをしているためです。

回答:


6

show_tiedRakuでDPを使用する場合、どのようにオフにしますか?

ステートメントの最後にリストされている「タグ」ではないAssociative s(例:Pairs)は、フラット化されたリストのインターリーブキーと値に明示的に変換する必要useがあります。1

最も直接的な解決策は、リテラルのフラットリストを手動で書き込むことです。

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

より適切なソリューションについては、以下の「使用」kvセクションを参照してください。

変数の注入

useステートメントはコンパイル時に評価されることに注意してください。したがって、リストに変数を挿入する場合は、ステートメントが評価される前に、名前だけでなく値もcompile-timeで確立されるようにする必要がありますuse。一部は実行時に発生するmy $foo = 0;ため、飾り気のないものでは不十分です。代わりに、次のような適切なコンパイル時の構成を使用する必要があります。= 0BEGIN

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

使用する kv

kvルーチンは、必要な生成することができ'key1', value1, 'key2', value2, ...、ハッシュ与えられたシーケンスを:

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

または:

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

脚注

1この回答は、「Data :: Printer in Rakuのパラメーターの変更」SOに応じて私が開いた問題から Stefanの説明に基づいています

解決策はかなり単純ですData::Printer:from<Perl5> 'show_tied', 0;。ファットコンマ=>PairRakuのコンストラクターですが、Perl 5 では単なるコンマです。Raku は(と同等)のPairタグをインポートするために引数を使用するものと見なします。これを回避してPerl 5コードが期待するものを渡すには、値を個別にリストします。:ALLALL => True

言い換えると、この変換の必要性は、PerlとRaku がタグ概念Perlのドキュメントの「タグ」 ; Rakuのドキュメントの「タグ」)を共有し、(偶然ではなく)タグを選択するために同じ構文を慣用的に使用しているためです()。:tagname

さらに、楽を使用して、(解決する必要が)のこの問題曖昧構文は、タグを指定するために使用されているかどうかの間かはに適用されるすべて Associativeのトップレベルで使用されるよuse声明、ない形で書かれたものだけ:fooが、書かれたものも含め以下のような他の形態においてfoo => bar{ foo => bar}%baz、または{ %baz }


これらの3つのソリューションは、私が指定したstackoverflow.com/questions/55799219/…のテスト例では機能しません。 それでも、すべての恐ろしいvar変数で誤った出力が表示されます。このパッケージはRakuで動作するようにも見えません。それは素晴らしい作品Perlで、残念だ:、(
CON

@conさん、こんにちは。1うまくいきます。参照してくださいあなたのテストスクリプト、私はそれを実行するシステムの詳細、およびそれが生成する出力の私のコピーを2このSOのガイダンスに従ってテストスクリプトのバリアントを実行すると、期待どおりにDPオプションをオン/オフにして、正常に機能します。3これらの結果は、私、HåkonHægland、およびStefan(IP5の作者)にとって本質的に同じです。4 Data :: PrinterはRakuで動作し、このSOは正しいと思います。5問題についてさらに議論したい場合は、以前のSOに関する私の回答にコメントしてください。TIA。
レイフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.