更改地图返回的上下文?

时间:2009-06-02 23:38:13

标签: perl

我正在尝试将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 个答案:

答案 0 :(得分:11)

怎么样:

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

答案 1 :(得分:2)

使用中间变量:

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

答案 2 :(得分:1)

由于OP询问哪种方法有更多的开销,这里有一个我用来比较两者的快速配置文件。您可以随意编辑条目以改进测量:

#!/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});