2009-06-02 19 views
2

我试图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; 

但它并不像我喜欢的那么短。任何帮助?

回答

11

如何:

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

通常,只要您想要引用数组/散列,就可以使用匿名数组/散列引用构造函数。例如my($ scalarref,$ arrayref,$ hashref)=(''foo',['foo','bar'],{foo =>'bar'}); – 2009-06-03 00:00:56

+0

是否会创建一个临时数组(开销)? – Timmy 2009-06-03 19:18:53

+0

这是你必须测量自己的东西,但是,我使用Benchmark.pm编写了测试用例(并使用“map {$ _ + 1} 1..1000000”),我的方法比你的方法快25% 。 :-)那么,它有开销吗?谁知道。但它的开销肯定比其他方法少。 – 2009-06-03 20:24:14

2

使用一个中间变量:

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