Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 更改地图返回的上下文?_Perl - Fatal编程技术网

Perl 更改地图返回的上下文?

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

我正在尝试将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 $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%:-)那么,它有开销吗?谁知道呢。但它的开销肯定比其他方法小。我在这里添加了分析脚本: