如何在Perl中从2D数组中提取列

如何在Perl中从2D数组中提取列,perl,parameters,arguments,parameter-passing,Perl,Parameters,Arguments,Parameter Passing,我试图将2d数组的特定列传递给perl中的函数。我只知道如何传递一维数组或二维数组 insertDeviceOIDstats(\$dbh, \@deviceMIB); sub insertDeviceOIDstats{ # Get passed arguments my ($dbh, $MIB) = @_; # Get the array from the reference my @objectsID = @{$MIB}; ... } 假设我有一个“2d”数组device

我试图将2d数组的特定列传递给perl中的函数。我只知道如何传递一维数组或二维数组

insertDeviceOIDstats(\$dbh, \@deviceMIB);

sub insertDeviceOIDstats{
  # Get passed arguments
  my ($dbh, $MIB) = @_;
  # Get the array from the reference
  my @objectsID = @{$MIB};
...

}
假设我有一个“2d”数组
deviceMIB

+----------------------+-------+
| ubntWlStatRssi       | 29    |
| ubntWlStatSignal     | -67   |
| ubntWlStatCcq        | 91    |
| ubntWlStatNoiseFloor | -96   |
+----------------------+-------+
我希望数组
@objectsID
$MIB
仅包含以下列:

+-------+
| 29    |
| -67   |
| 91    |
| -96   |
+-------+
有多少种方法可以只将一列传递给函数?哪种方法更有效


我是否应该以某种方式对数组进行预切片,或者在使用lamda函数或熟悉的东西传递参数时是否有方法进行预切片?

最可读的方法可能是创建一个只包含所需数据的新数组

my @ids = map { $_->[1] } @deviceMIB;
insertDeviceOIDstats(\$dbh, \@ids);
但是,与Perl中的任何内容一样,可以跳过中间的
@ids
数组:

insertDeviceOIDstats(\$dbh, [ map { $_->[1] @deviceMIB } ]);

第二种方法使用
map
获取所需ID的列表,并使用匿名数组构造函数(
[…]
)将其转换为数组并提供对该数组的引用。

最可读的方法可能是创建一个只包含所需数据的新数组

my @ids = map { $_->[1] } @deviceMIB;
insertDeviceOIDstats(\$dbh, \@ids);
但是,与Perl中的任何内容一样,可以跳过中间的
@ids
数组:

insertDeviceOIDstats(\$dbh, [ map { $_->[1] @deviceMIB } ]);
第二种方法使用
map
获取所需ID的列表,并使用匿名数组构造函数(
[…]
)将其转换为数组并提供对该数组的引用

有多少种方法可以只将一列传递给函数?哪种方法更有效

我不相信你真的想知道有多少种方法。假设我告诉你有42种方法,你会如何处理这些信息

最有效的方法是传递整个数组,然后使用
$MIB->[$i][1]
等方法到达第二列


首先,
$dbh
已经是一个引用,事实上它是一个对象,所以不需要传递对它的引用

其次,我猜您需要数据的第二列,它需要一个
映射
,无论是在调用子程序时还是在子程序内部

此代码转储原始的
@deviceMIB
,然后使用
map
创建包含第二列的数组,并将其传递给子例程。然后将
$MIB
转储到子例程中

没有理由将
@$MIB
复制到
@objectsID
中,因此我省略了这一点,您只需通过引用访问数组元素即可。事实上,可能根本不需要提取第二列,因为所有信息都在主数组中,而且它复制该列中的所有数据也是浪费

use strict;
use warnings 'all';
use feature 'say';

use Data::Dump;

my $dbh;

my @deviceMIB = map [ split ], <DATA>;

dd \@deviceMIB;

insertDeviceOIDstats( $dbh, [ map $_->[1], @deviceMIB ] );

sub insertDeviceOIDstats {

    # Get passed arguments
    my ( $dbh, $MIB ) = @_;

    dd $MIB;
}

__DATA__
ubntWlStatRssi        29
ubntWlStatSignal     -67
ubntWlStatCcq         91
ubntWlStatNoiseFloor -96
有多少种方法可以只将一列传递给函数?哪种方法更有效

我不相信你真的想知道有多少种方法。假设我告诉你有42种方法,你会如何处理这些信息

最有效的方法是传递整个数组,然后使用
$MIB->[$i][1]
等方法到达第二列


首先,
$dbh
已经是一个引用,事实上它是一个对象,所以不需要传递对它的引用

其次,我猜您需要数据的第二列,它需要一个
映射
,无论是在调用子程序时还是在子程序内部

此代码转储原始的
@deviceMIB
,然后使用
map
创建包含第二列的数组,并将其传递给子例程。然后将
$MIB
转储到子例程中

没有理由将
@$MIB
复制到
@objectsID
中,因此我省略了这一点,您只需通过引用访问数组元素即可。事实上,可能根本不需要提取第二列,因为所有信息都在主数组中,而且它复制该列中的所有数据也是浪费

use strict;
use warnings 'all';
use feature 'say';

use Data::Dump;

my $dbh;

my @deviceMIB = map [ split ], <DATA>;

dd \@deviceMIB;

insertDeviceOIDstats( $dbh, [ map $_->[1], @deviceMIB ] );

sub insertDeviceOIDstats {

    # Get passed arguments
    my ( $dbh, $MIB ) = @_;

    dd $MIB;
}

__DATA__
ubntWlStatRssi        29
ubntWlStatSignal     -67
ubntWlStatCcq         91
ubntWlStatNoiseFloor -96

这就是您的图片中的
@deviceMIB
,而
$deviceMIB[0]
就是
('ubntWlStatRssi',29)
。对吗?你想把
$MIB
变成什么?@Borodin我把这个问题编辑得更具体一些。我不明白你的数据结构。在
@deviceMIB
中实际上有什么,您想从中得到什么(在Perl语法中)?因此在您的图片中是
@deviceMIB
,而
$deviceMIB[0]
('ubntWlStatRssi',29)
。对吗?你想把
$MIB
变成什么?@Borodin我把这个问题编辑得更具体一些。我不明白你的数据结构。
@deviceMIB
中到底有什么内容?您想从中得到什么(在Perl语法中)?但在我看来,作者必须再次检查,他总是以相同的顺序拥有相同的行,并且具有相同的名称,但在我看来,如果作者不想以大量没有意义的数字结尾,他就必须再次检查他是否总是有相同的行,相同的名称以相同的顺序,如果他不想以大量没有意义的数字结尾。