我想从Python转学Perl,但是在Python中有以下内置的哈希转字符串功能:
>>> 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"
,却没有找到我需要的内容。谢谢!
use Data::Dumper;
local $Data::Dumper::Terse = 1;
my $str = Dumper({a => 1, b => 2, c => 3});
另请参阅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}
有一个Data::Dumper
模块可以实现这种类型的转换。
$VAR1 =
。 - Leon Timmermans$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中。
另一种Swallow解决方案:
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] }
];
};
如果您有多级结构的潜力,上述解决方案中有几个问题。
具体来说,是这个标志:
$Data::Dumper::Terse = 1;
正如Data::Dumper的perldoc页面所述,“terse”标志可能会生成非perl可解析的输出。
如果可能会有多层结构,则正确的做法是使用:
$Data::Dumper::Indent = 0;
这个方法保证可以被perl的eval函数解析,因此非常容易将其序列化为纯文本格式。