Преобразовать строку в хеш - PullRequest
0 голосов
/ 23 мая 2018

Есть ли способ / lib преобразовать строку в хеш?У меня есть такая строка

{"hello"=>["world","perl"],"foo"=>"bar"}

, и я хотел бы получить доступ к различным значениям, как если бы это был хеш

Спасибо

Ответы [ 3 ]

0 голосов
/ 23 мая 2018

Использование eval ():

#!/usr/bin/env perl
use strict;
use Data::Dumper;

my $string = qw( {"hello"=>["world","perl"],"foo"=>"bar"} );
print "String: $string\n";

my $hash = eval($string);
print "Hash: ", Dumper($hash), "\n";

Вывод

String: {"hello"=>["world","perl"],"foo"=>"bar"}
Hash: $VAR1 = {
          'foo' => 'bar',
          'hello' => [
                       'world',
                       'perl'
                     ]
        };

Использование reval () и Safe , если вы вообщеобеспокоен вводом:

#!/usr/bin/env perl
use strict;
use Safe;
use Data::Dumper;

my $string = qw( {"hello"=>["world","perl"],"foo"=>"bar"} );
print "String: $string\n";

my $compartment = new Safe;
my $hash = $compartment->reval($string);
print $@ ? "reval error: $@" : ("Hash: ", Dumper($hash)), "\n";
0 голосов
/ 23 мая 2018

Если вы не возражаете, чтобы я подключил один из моих собственных модулей: Config::Perl использует PPI для разбора таких строк без необходимости eval:

use warnings;
use strict;
use Data::Dumper; # Debug
use Config::Perl;

my $str = q( {"hello"=>["world","perl"],"foo"=>"bar"} );

my $data = Config::Perl->new->parse_or_die(\$str)->{_}[0];

print Dumper($data); # Debug

Вывод:

$VAR1 = {
          'hello' => [
                       'world',
                       'perl'
                     ],
          'foo' => 'bar'
        };

(Приведенный выше код предполагает, что у вас есть только один хэш-реф в ваших данных, если у вас естьвариации, вам придется взглянуть на всю структуру данных, возвращаемую parse_or_die.)

0 голосов
/ 23 мая 2018

Преобразуйте строку со структурой данных Perl в строку со структурой данных JSON, заменив => на : и расшифровав ее с помощью пакета JSON.

#!/usr/bin/env perl

use warnings FATAL => 'all';
use strict;
use Data::Dumper;
use JSON qw(decode_json); # use JSON::XS for more performance

my $string = '{"hello"=>["world","perl"],"foo"=>"bar"}';
$string =~ s/"=>/":/g;
print Dumper(decode_json($string));

Вывод

$VAR1 = {
          'hello' => [
                       'world',
                       'perl'
                     ],
          'foo' => 'bar'
        };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...