Изменить контекст возврата карты? - PullRequest
2 голосов
/ 03 июня 2009

Я пытаюсь разобрать строку JSON в ссылку на массив:

my $str = '[[2],[1]]';
my $data = map { $_->[0] } @{decode_json( $str )};

но это делает его скалярным. Я могу сделать:

my $str = '[[2],[1]]';
my @data = map { $_->[0] } @{decode_json( $str )};
my $data = \@data;

но это не так коротко, как мне нравится. любая помощь?

Ответы [ 3 ]

11 голосов
/ 03 июня 2009

Как насчет:

my $str = '[[2],[1]]';
my $data = [map {$_->[0]} @{decode_json($str)}];
2 голосов
/ 03 июня 2009

Использование промежуточной переменной:

my $str = '[[2],[1]]';
my @data = map { $_->[0] } @{decode_json( $str )};
my $data = \@data;
1 голос
/ 04 июня 2009

Поскольку ОП спросил, какой подход имеет больше накладных расходов, вот быстрый профиль, который я использовал для сравнения двух. Не стесняйтесь редактировать запись с способами улучшения измерения:

#!/usr/bin/perl -w
use strict;
use Benchmark qw(cmpthese);

sub count(\$$) {
    ${$_[0]} += @{$_[1]};
}

sub a() {
    count($a, [map {$_ + 1} 1..1000000]);
}

sub b() {
    my @d = map {$_ + 1} 1..1000000;
    count($b, \@d);
}

cmpthese(-10, {a => \&a, b => \&b});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...