在Perl中是否内置了“hash to string”?

时间:2009-01-19 23:54:35

标签: string perl hash

我要从Python背景学习Perl,其中对语言内置了以下哈希到字符串的转换:

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

是否有内置和/或模块具有子程序,其输出沿着以下行:

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

奇怪的是,perl "hash to string"的网络搜索没有找到我正在寻找的任何内容。谢谢!

6 个答案:

答案 0 :(得分:42)

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

答案 1 :(得分:27)

另见JSON

#!/usr/bin/perl
use warnings; use strict;
use JSON;

my $data = {a => 1, b=> 2, c => 3};

print to_json($data);

这会产生:

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

答案 2 :(得分:11)

Data::Dumper模块有一种方法可以进行这种转换。

答案 3 :(得分:6)

使用Data::Dump代替Data :: Dumper。它基本上是相同的,除非没有那令人讨厌的$VAR1 = ...残骸:

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

产地:

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

如果您使用的是Windows,则自版本5.8以来,Data :: Dump已预先安装了ActivePerl

答案 4 :(得分:2)

另一种燕子解决方案:

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

但请改用Data::Dumper

对于非常精美的输出,您也可以使用:

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;
}

如果您愿意,首先应该使用某些键,而不是使用此方法(我首先需要type,然后需要position秒):

    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] }
            ];
    };

答案 5 :(得分:2)

如果您具有多级结构的潜力,上述几种解决方案都存在问题。

特别是这个标志:

$Data::Dumper::Terse    = 1;

如Data :: Dumper的perldoc页面所述,“terse”标志可以生成非perl可解析输出。

如果您可能要使用多深度结构,那么正确的做法是使用:

$Data::Dumper::Indent = 0;

这保证是eval可以解析perl,这使得对明文进行序列化非常简单...