hashes string perl hash

string - hash of hashes perl



¿Hay un "hash to string" integrado en Perl? (6)

Voy a aprender Perl de un fondo de Python donde la siguiente conversión de hash a string está integrada en el lenguaje:

>>> d = {''a'': 1, ''b'': 2, ''c'': 3} >>> str(d) "{''a'': 1, ''c'': 3, ''b'': 2}"

¿Hay un módulo incorporado y / o que tenga una subrutina con salida a lo largo de las líneas de:

"(''a'' => 1, ''b'' => 2, ''c'' => 3)"

Extrañamente, una búsqueda en la web de perl "hash to string" no aparece nada en la línea que estoy buscando. ¡Gracias!


Existe el módulo Data::Dumper que una forma de hacer este tipo de transformación.


Sin embargo, otra solución Swallow:

sub pp { my $h = shift(); qq[{${/(join'','',map"$_=>$h->{$_}",keys%$h)}}] } print pp({a => 1, b => 2, c => 3});

Pero usa Data::Dumper lugar.

Para un resultado muy sofisticado, puede usar también:

use Data::Dumper; use Perl::Tidy; sub pp { local $Data::Dumper::Terse = 1; local $Data::Dumper::Indent = 0; my $source = Dumper(@_); my $result; Perl::Tidy::perltidy( source => /$source, destination => /$result, argv => [qw(-pbp -nst)] ); return $result; }

Si prefieres algunas teclas, primero deberías utilizar este enfoque (quiero primero el type y luego el segundo):

local $Data::Dumper::Sortkeys = sub { [ sort { if ( $b eq ''type'' ) {1} elsif ( $a eq ''type'' ) {-1} elsif ( $b eq ''position'' ) {1} elsif ( $a eq ''position'' ) {-1} else { $a cmp $b } } keys %{ $_[0] } ]; };


Use Data :: Dump en lugar de Data :: Dumper. Es básicamente lo mismo, excepto sin ese molesto $VAR1 = ... cruft:

use Data::Dump "pp"; print pp({a => 1, b => 2, c => 3});

Produce:

{ a => 1, b => 2, c => 3 }

Si está en Windows, Data :: Dump viene preinstalado con ActivePerl desde la versión 5.8.


use Data::Dumper; local $Data::Dumper::Terse = 1; my $str = Dumper({a => 1, b => 2, c => 3});


Ver también JSON :

#!/usr/bin/perl use warnings; use strict; use JSON; my $data = {a => 1, b=> 2, c => 3}; print to_json($data);

Esto produce:

{"c":3,"a":1,"b":2}


Varias de las soluciones anteriores tienen un problema si tiene el potencial para estructuras de varios niveles.

Específicamente esta bandera:

$Data::Dumper::Terse = 1;

Como se indica en la página de Perldoc para Data :: Dumper, la bandera "corta" podría generar resultados parseables no perl.

Si posiblemente vas a tener estructuras con varias profundidades, lo mejor sería usar:

$Data::Dumper::Indent = 0;

Que se garantiza que perl será analizable por eval, lo que hace una manera muy fácil de hacer serialización a texto plano ...