Есть ли в Perl встроенный "хеш-строка"? - PullRequest
15 голосов
/ 20 января 2009

Я собираюсь изучать 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" ничего не обнаруживает в соответствии с тем, что я ищу. Спасибо!

Ответы [ 6 ]

42 голосов
/ 20 января 2009
use Data::Dumper;
local $Data::Dumper::Terse = 1;
my $str = Dumper({a => 1, b => 2, c => 3});
27 голосов
/ 20 января 2009

См. Также 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}
11 голосов
/ 20 января 2009

Существует модуль Data::Dumper, который является одним из способов такого преобразования.

6 голосов
/ 20 января 2009

Используйте Data :: Dump вместо Data :: Dumper. Это в основном то же самое, за исключением того, что не раздражает $VAR1 = ... cruft:

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

Производит:

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

Если вы работаете в Windows, Data :: Dump поставляется с ActivePerl , начиная с версии 5.8.

2 голосов
/ 03 ноября 2011

Некоторые из вышеперечисленных решений имеют проблему, если у вас есть потенциал для многоуровневых структур.

В частности, этот флаг:

$Data::Dumper::Terse    = 1;

Как отмечено на странице perldoc для Data :: Dumper, флаг "terse" может генерировать не анализируемый perl вывод.

Если вы, возможно, собираетесь использовать структуры с несколькими глубинами, то вместо этого следует использовать:

$Data::Dumper::Indent = 0;

Что гарантированно будет проанализировано perl eval, что делает очень простой способ сериализации в открытый текст ...

2 голосов
/ 20 января 2009

Еще одно решение по ласточке:

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] }
            ];
    };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...