我正在编写一个从功率计读取数据的脚本。我已经确定了几个设备使用的瓦特数,并且有一个变量来识别瓦数和跳跃。当设备开启时。我已将每个设备瓦数声明为范围,并声明包含所有设备阵列的数组,如下所示 -
@device1 = (30..40);
@device2 = (50..70);
@device3 = (100..150);
@device_array1 = (\@device1, \@device2, \@device3);
脚本读取仪表的输出并生成$watts_jump
变量。但是,我无法确定一种工作方法,以便将变量与@device_array1
及其“' sub”相匹配。阵列。
我应该使用grep
还是使用List::Utils 'first'
方法?
我已经尝试了以下内容 -
use List::Utils 'first';
my $device = first { /$watts_jump/ } @device_array1;
作为字符串方法的grep替代方法但是既没有找到匹配又报告回来。如果我print "$device_array1[1][2]\n";
或变体 - 它会返回正确的值。
如果匹配,我需要匹配的内容而不是其索引,例如
$watts_jump
= 55因此$device = $device2
我们将非常感谢您提供的任何帮助或指示。你可以告诉我这是我第一次尝试用perl和我的第一篇文章做任何严肃的事情,所以要温柔。第一个指导我到perldoc的人是我的圣诞卡清单: - )
TIA
答案 0 :(得分:2)
我做这样的事情:
my @specs = (
{ range => [30, 40], table => "foo" },
{ range => [50, 70], table => "bar" },
{ range => [100, 150], table => "baz" },
);
my $table;
for my $spec (@specs) {
my ($lo, $hi) = @{$spec->{range}};
if ($input >= $lo && $input <= $hi) {
$table = $spec->{table};
last;
}
}
if (!defined $table) {
die "Bad input: $input";
}
update_the_table($table);
也就是说,我不是预先扩展整个范围然后测试列表成员资格,而是只存储端点并检查输入是否在这些端点之间。
我还会在同一数据结构中存储您要更新的表的名称,因为它会将所有相关信息保存在同一位置。
答案 1 :(得分:1)
清理:
my @device1 = 30..40;
my @device2 = 50..70;
my @device3 = 100..150;
my @devices = ( \@device1, \@device2, \@device3 );
所以你想找到@devices
的索引,所以你要迭代@devices
的索引。您可以按如下方式执行此操作:
my @matching_device_indexes = grep { ... } 0..$#devices;
缺少的代码应确定标识的设备是否与跳转匹配。要检查的设备通过索引标识到@devices
,这意味着要比较的瓦数在$devices[$_]
引用的数组中。因此,您可以检查标识的设备是否与跳转匹配,如下所示:
0+grep { $_ == $watts_jump } @{ $devices[$_] }
(将grep
添加到标量上下文中,返回匹配数而不是匹配项。)
所有在一起:
my @matching_device_indexes =
grep {
0+grep { $_ == $watts_jump } @{ $devices[$_] }
} 0..$#devices;
如果您始终处理范围,则仅指定范围的端点更有意义。
my @device1 = ( 30, 40 );
my @device2 = ( 50, 70 );
my @device3 = ( 100, 150 );
my @devices = ( \@device1, \@device2, \@device3 );
解决方案变为
my @matching_device_indexes =
grep {
$devices[$_][0] <= $watts_jump
&&
$watts_jump <= $devices[$_][1]
} 0..$#devices;
答案 2 :(得分:0)
一个非常简单的solution,带有哈希:
use strict;
use warnings;
my @device1 = (30..40);
my @device2 = (50..70);
my @device3 = (100..150);
my $device_array1 = {1 => \@device1, 2 => \@device2, 3=> \@device3};
my $dev_count = scalar(keys %{$device_array1});
my $value = 65;
for (my $i=1; $i<=$dev_count; $i++)
{
if ( scalar(grep $value == $_, @{$device_array1->{$i}}) > 0)
{
print "Device $i";
}
}