如何在Perl中从2D数组中提取列
我试图将2d数组的特定列传递给perl中的函数。我只知道如何传递一维数组或二维数组如何在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
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语法中)?但在我看来,作者必须再次检查,他总是以相同的顺序拥有相同的行,并且具有相同的名称,但在我看来,如果作者不想以大量没有意义的数字结尾,他就必须再次检查他是否总是有相同的行,相同的名称以相同的顺序,如果他不想以大量没有意义的数字结尾。