Перебор массива с использованием другого массива без их объединения

#arrays #perl

#массивы #perl

Вопрос:

Что я пытаюсь сделать, так это использовать массив имен для перебора нескольких разных массивов. Вот что у меня есть

 my @Sensor1 = ("1.2.3.4","1.2.3.5","1.2.3.6");
my @Sensor2 = ("2.2.2.1","2.2.2.2","2.2.2.3");
my @Sensor3 = ("128.0.0.1","128.0.0.2","128.0.0.3");
my @Names = ("Sensor1","Sensor2","Sensor3");
my ($Name, $IP);

foreach $Name (@Names){
  foreach $IP (@$Name){
    print "$Name"," $IP","n";
  }
}
  

Это приводит к выдаче ошибки, потому что он пытается искать массив с именем «@$ Name», когда я хочу, чтобы он искал «@Sensor1», «@Sensor2» и «@ Sensor3».

Ответ №1:

Мой совет — использовать лучшую структуру данных. Например:

 use strict;
use warnings;

my %sensors = (
    Sensor1 => ['1.2.3.4',  '1.2.3.5',  '1.2.3.6'],
    Sensor2 => ['2.2.2.1',  '2.2.2.2',  '2.2.2.3'],
    Sensor3 => ['128.0.0.1','128.0.0.2','128.0.0.3'],
);

for my $sensor_name (sort keys %sensors){
    my $ips = $sensors{$sensor_name};
    print "$sensor_name: $_n" for @$ips;
}
  

Также смотрите классическую статью Марка Джейсона Доминуса: Почему глупо «использовать переменную в качестве имени переменной». Ключевой момент резюмируется в конце части 3 следующим образом:

Одной из самых больших проблем во всем программировании на компьютере является управление пространством имен и сокрытие данных. Когда вы используете символическую ссылку, вы выбрасываете сорок лет дорогостоящих уроков из Школы жестких ударов.

Комментарии:

1. Огромное спасибо!!! Мне явно нужно потратить больше времени на работу с хэшами, поскольку это было такое простое решение.