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

时间:2017-07-31 13:00:26

标签: perl parameters arguments parameter-passing

我正在尝试将2d数组的特定列传递给perl中的函数。我只知道如何传递1darray或2d阵列。

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函数或熟悉的东西传递参数时是否有办法实现?

2 个答案:

答案 0 :(得分:3)

  

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

我不相信你真的想知道有多少种方式。假设我告诉过你有42种方法,你会对这些信息做些什么?

传递整个数组效率最高,并使用$MIB->[$i][1]等来获取第二列

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

其次,我猜你想要数据的第二列,这需要一个map,无论是你调用子程序还是内部

此代码转储原始@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

输出

[
  ["ubntWlStatRssi", 29],
  ["ubntWlStatSignal", -67],
  ["ubntWlStatCcq", 91],
  ["ubntWlStatNoiseFloor", -96],
]
[29, -67, 91, -96]

答案 1 :(得分:2)

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

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

但是,与Perl中的任何内容一样,可以跳过中间@ids数组:

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

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