Perl 从多维数组中提取列

Perl 从多维数组中提取列,perl,Perl,我有一个多维数组 my @multi = ( [ 1, "first", "a" ], [ 2, "second", b ], [ 3, "third", c] ... ); 我想提取一个一维数组: [ "first", "second", "third" ... ] 这些将是对@multi[0][1]、@multi[1][1]、@multi[2][1]的引用组合 我该怎么做 [ map { $_->[1] } @multi ] 例如,您可以这样做: use strict; my

我有一个多维数组

my @multi = ( [ 1, "first", "a" ], [ 2, "second", b ], [ 3, "third", c] ... );
我想提取一个一维数组:

[ "first", "second", "third" ... ]
这些将是对@multi[0][1]、@multi[1][1]、@multi[2][1]的引用组合

我该怎么做

[ map { $_->[1] } @multi ]


例如,您可以这样做:

use strict;

my @multi = ( [ 1, "first", "a" ], [ 2, "second", "b" ], [ 3, "third", "c" ] );
my $res;

push @$res, $_->[1] for @multi;

use Data::Dump;
dd $res;
输出:

["first", "second", "third"]

例如,您可以这样做:

use strict;

my @multi = ( [ 1, "first", "a" ], [ 2, "second", "b" ], [ 3, "third", "c" ] );
my $res;

push @$res, $_->[1] for @multi;

use Data::Dump;
dd $res;
输出:

["first", "second", "third"]

您需要使用反引用:

my @multi = ( [ 1, "first", "a" ], [ 2, "second", b ], [ 3, "third", c]);
my $index = 0;
my @single;
foreach (@multi) {
    my $aref = $multi[$index];
    $single[$index] = $aref->[1];
    $index++;
}
print "\n @single \n";
输出:
first second third

您需要使用反引用:

my @multi = ( [ 1, "first", "a" ], [ 2, "second", b ], [ 3, "third", c]);
my $index = 0;
my @single;
foreach (@multi) {
    my $aref = $multi[$index];
    $single[$index] = $aref->[1];
    $index++;
}
print "\n @single \n";
输出:
第一个第二个第三个

数组的数组 这一点在
perldoc perllol
man perllol

您可以取消对数组变量的引用:

map { ${$_}[1] } @multi
相同内容的另一种语法:

map { $_->[1] } @multi
尝试:

及 将呈现:

$other = [[1,undef,'A'],[2,['first','second','third'],'B']];
哪里 可以提供:

1
2
first
third
B
数组的数组 这一点在
perldoc perllol
man perllol

您可以取消对数组变量的引用:

map { ${$_}[1] } @multi
相同内容的另一种语法:

map { $_->[1] } @multi
尝试:

及 将呈现:

$other = [[1,undef,'A'],[2,['first','second','third'],'B']];
哪里 可以提供:

1
2
first
third
B

最好使用push:
push@single,$aref->[1]好的。我还是perl新手,只是阅读了一些参考资料。您能解释一下为什么push会更好吗?因为您几乎不需要在perl中迭代数组索引,所以它不是一个很好使用的习惯用法。我认为从风格上来说,它也不那么“好”。例如,在上面:
foreach我的$aref(@multi){push@single,$aref->[1];}
将完成同样的事情,而不需要额外的变量。@Manpret bhamba:让你把数组看作一个类。这使我们更容易考虑将阵列作为单个实体使用。例如,可以将数组用作双端队列(deq)。DEQ的所有方法都可以用一行Perl实现。感谢Sobrique&Shawn的解释。最好使用push:
push@single,$aref->[1]好的。我还是perl新手,只是阅读了一些参考资料。您能解释一下为什么push会更好吗?因为您几乎不需要在perl中迭代数组索引,所以它不是一个很好使用的习惯用法。我认为从风格上来说,它也不那么“好”。例如,在上面:
foreach我的$aref(@multi){push@single,$aref->[1];}
将完成同样的事情,而不需要额外的变量。@Manpret bhamba:让你把数组看作一个类。这使我们更容易考虑将阵列作为单个实体使用。例如,可以将数组用作双端队列(deq)。DEQ的所有方法都可以在Perl中用一行代码实现。感谢Sobrique&Shawn的解释。