Perl 更改地图返回的上下文?
我正在尝试将JSON字符串解析为数组引用:Perl 更改地图返回的上下文?,perl,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; 但它没有我喜欢的那么短。有什么帮助吗?使用中间变量: my $str
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 $data = \@data;
那么:
my $str = '[[2],[1]]';
my $data = [map {$_->[0]} @{decode_json($str)}];
因为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});
通常,只要您想要数组/哈希的引用,就可以使用匿名数组/哈希引用构造函数。e、 例如,my($scalarref,$arrayref,$hashref)=(\'foo',['foo','bar'],{foo=>'bar'});这是否会创建一个临时数组(开销)?这是您必须自己测量的,但是,我使用Benchmark.pm编写了一个测试用例(并使用“map{$\u1}1..1000000”),我的方法比您的方法快大约25%:-)那么,它有开销吗?谁知道呢。但它的开销肯定比其他方法小。我在这里添加了分析脚本: