Como desativo a opção `show_tied` do módulo Perl 5 Data :: Printer ao usá-lo no Raku?

8

Eu usei o módulo CPAN Perl Data :: Printer (DP) com Perl. Isso funciona muito bem.

Agora eu quero usá-lo no código Raku.

Quando eu uso o :from<Perl5>recurso para importá-lo e, em seguida, executar o código usando-o, a anotação (tied to Perl6::Hash)é anexada à exibição de hashes. 1

Como o documento CPAN do DP mostra, esta anotação é controlada pela opção show_tied. Quero desativá- lo (configurá-lo como 0) em vez do seu padrão ativado (definido como 1). Aqui está como eu faria isso no Perl:

use Data::Printer show_tied => 0;

Mas quando eu tento isso em Raku:

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

Eu recebo:

Erro ao importar do 'Data :: Printer': nenhuma tag 'show_tied'

Como desligo show_tiedao usar o DP no Raku?

Notas de rodapé

1 Talvez isso ocorra porque o Inline :: Perl5 (que implementa o :from<Perl5>recurso) está fazendo algo para permitir a interoperabilidade suave do Perl / Raku.

raiph
fonte

Respostas:

6

Como desligo show_tiedao usar o DP no Raku?

Você deve converter explicitamente Associatives (por exemplo, Pairs) listados no final de uma useinstrução, que não são "tags", em uma lista nivelada que intercala chaves e valores. 1

A solução mais direta é escrever manualmente uma lista simples de literais, por exemplo:

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

Para uma solução mais limpa, consulte a seção Usandokv abaixo.

Injetando variáveis

Observe que as useinstruções são avaliadas em tempo de compilação . Portanto, se você deseja injetar variáveis ​​na lista, precisa garantir que seus valores, não apenas seus nomes, também sejam estabelecidos em tempo de compilação , antes que a useinstrução seja avaliada. Um sem adorno my $foo = 0;não será suficiente porque a = 0peça ocorrerá em tempo de execução . Em vez disso, você precisará usar uma construção de tempo de compilação adequada, como BEGIN:

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

Usando kv

A kvrotina pode gerar a 'key1', value1, 'key2', value2, ...sequência desejada com um hash:

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

ou:

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

Notas de rodapé

1 Esta resposta foi construída com base na explicação de Stefan do problema que abri em resposta ao "Alterando parâmetros no Data :: Printer in Raku" SO :

A solução é bastante simples: use Data::Printer:from<Perl5> 'show_tied', 0;A vírgula gorda =>é um Pairconstrutor em Raku, enquanto na verdade é apenas uma vírgula sofisticada no Perl 5. Raku considera Pairargumentos a serem usados ​​para importar tags como :ALL(que é equivalente a ALL => True). Para contornar isso e passar o que o código Perl 5 espera, basta listar os valores individualmente.

Em outras palavras, essa necessidade de conversão ocorre porque Perl e Raku compartilham a noção de tags ( documento Perl sobre "tags" ; documento Raku sobre "tags" ) e (não por coincidência) usam linguisticamente a mesma sintaxe para selecionar tags ( :tagname).

Além disso, usando Raku, essa questão de (a necessidade de resolver) ambiguidade entre se a sintaxe está sendo usada para especificar tags ou não se aplica a todos os Associative s usados ​​no nível superior de uma useinstrução, não apenas os escritos no formulário, :foomas também os escritos em outras formas, tais como foo => bar, { foo => bar}, %baz, ou { %baz }.

raiph
fonte
essas 3 soluções não funcionam, dado o exemplo de teste que dei a stackoverflow.com/questions/55799219/… ainda mostra a saída incorreta com todas as varvariáveis terríveis . Não parece que este pacote funcione no Raku. É uma pena, no Perl funciona maravilhosamente
con
Oi @con. 1 Funciona para mim. Veja minha cópia do seu script de teste, detalhes do sistema em que o executo e a saída que ele produz . 2 Quando executo variantes do seu script de teste de acordo com as orientações deste SO, elas também funcionam como deveriam, ativando / desativando as opções de DP conforme o esperado. 3 Esses resultados são essencialmente os mesmos para mim, HåkonHægland e Stefan (autor do IP5). 4 Acho que o Data :: Printer funciona em Raku e esse SO está correto. 5 Se você quiser discutir mais o seu problema, comente a minha resposta na sua SO anterior. TIA.
raiph