我试图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;
但它并不像我喜欢的那么短。任何帮助?
我试图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;
但它并不像我喜欢的那么短。任何帮助?
如何:
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;
由于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});
通常,只要您想要引用数组/散列,就可以使用匿名数组/散列引用构造函数。例如my($ scalarref,$ arrayref,$ hashref)=(''foo',['foo','bar'],{foo =>'bar'}); – 2009-06-03 00:00:56
是否会创建一个临时数组(开销)? – Timmy 2009-06-03 19:18:53
这是你必须测量自己的东西,但是,我使用Benchmark.pm编写了测试用例(并使用“map {$ _ + 1} 1..1000000”),我的方法比你的方法快25% 。 :-)那么,它有开销吗?谁知道。但它的开销肯定比其他方法少。 – 2009-06-03 20:24:14