Perl匹配数组数组的变量

时间:2015-09-26 23:49:02

标签: arrays regex perl

我正在编写一个从功率计读取数据的脚本。我已经确定了几个设备使用的瓦特数,并且有一个变量来识别瓦数和跳跃。当设备开启时。我已将每个设备瓦数声明为范围,并声明包含所有设备阵列的数组,如下所示 -

@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

3 个答案:

答案 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";
    }
}