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 ...