我正在尝试将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函数或熟悉的东西传递参数时是否有办法实现?
答案 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>