¿Cómo desactivo la opción `show_tied` de Data :: Printer del módulo Perl 5 cuando la uso en Raku?

8

He usado el módulo CPAN Perl Data :: Printer (DP) con Perl. Funciona muy bien

Ahora quiero usarlo en el código Raku.

Cuando uso la :from<Perl5>función para importarlo y luego ejecuto el código que lo usa, la anotación (tied to Perl6::Hash)se agrega a la visualización de hashes. 1

Como muestra el documento CPAN CP de DP , esta anotación está controlada por la opción show_tied. Quiero cambiarlo fuera (en posición 0) en lugar de su valor por defecto en (conjunto de 1). Así es como lo haría en Perl:

use Data::Printer show_tied => 0;

Pero cuando intento esto en Raku:

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

Yo obtengo:

Error al importar desde 'Datos :: Impresora': no ​​existe tal etiqueta 'show_tied'

¿Cómo show_tiedapago cuando uso DP en Raku?

Notas al pie

1 Quizás esto se deba a que Inline :: Perl5 (que implementa la :from<Perl5>función) está haciendo algo para habilitar la interoperabilidad Perl / Raku sin problemas.

raiph
fuente

Respuestas:

6

¿Cómo show_tiedapago cuando uso DP en Raku?

Debe convertir explícitamente Associatives (por ejemplo, Pairs) que se enumeran al final de una usedeclaración, que no son "etiquetas", en una lista aplanada que entrelaza claves y valores. 1

La solución más directa es escribir manualmente una lista plana de literales, por ejemplo:

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

Para una solución más ordenada, consulte la sección Uso akv continuación.

Inyectando variables

Tenga en cuenta que las usedeclaraciones se evalúan en tiempo de compilación . Entonces, si desea inyectar variables en la lista, entonces debe asegurarse de que sus valores, no solo sus nombres, también se establezcan en tiempo de compilación , antes de useevaluar la declaración. Un sin adornos my $foo = 0;no será suficiente porque la = 0parte sucederá en tiempo de ejecución . En su lugar, deberá utilizar una construcción adecuada en tiempo de compilación como BEGIN:

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

Utilizando kv

La kvrutina puede generar la 'key1', value1, 'key2', value2, ...secuencia deseada dado un hash:

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

o:

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

Notas al pie

1 Esta respuesta se basó en la explicación de Stefan del problema que abrí en respuesta a la "Alteración de parámetros en Datos :: Impresora en Raku" SO :

La solución es bastante simple: usar Data::Printer:from<Perl5> 'show_tied', 0;La coma gruesa =>es un Pairconstructor en Raku, mientras que en realidad es solo una coma elegante en Perl 5. Raku considera que los Pairargumentos se usan para importar etiquetas como :ALL(que es equivalente a ALL => True). Para evitar esto y pasar lo que el código de Perl 5 espera, solo enumere los valores individualmente.

En otras palabras, esta necesidad de conversión se debe a que Perl y Raku comparten la noción de etiquetas ( documento de Perl sobre "etiquetas" ; documento de Raku sobre "etiquetas" ) y (no por casualidad) usan idiomáticamente la misma sintaxis para seleccionar etiquetas ( :tagname).

Además, usando Raku, este problema de (la necesidad de resolver) la ambigüedad entre si la sintaxis se está utilizando para especificar etiquetas o no se aplica a todos Associative los correos electrónicos utilizados en el nivel superior de una usedeclaración, no solo los escritos en el formulario :foosino incluso los escritos en otras formas tales como foo => bar, { foo => bar}, %baz, o { %baz }.

raiph
fuente
estas 3 soluciones no funcionan dado el ejemplo de prueba que le di a stackoverflow.com/questions/55799219/ ... todavía muestra la salida incorrecta con todas las varvariables terribles . Parece que este paquete ni siquiera funciona en Raku. Es una pena, en Perl funciona de maravilla: (
con
Hola @con. 1 Funciona para mi. Vea mi copia de su script de prueba, detalles del sistema en el que lo ejecuto y el resultado que produce . 2 Cuando ejecuto variantes de su script de prueba según las instrucciones de este SO, también funcionan como deberían, activando / desactivando las opciones DP como se esperaba. 3 Estos resultados son esencialmente los mismos para mí, HåkonHægland y Stefan (autor de IP5). 4 Creo que Data :: Printer funciona en Raku y este SO es correcto. 5 Si desea analizar más su problema, comente mi respuesta sobre su SO anterior. TIA
Raiph