Что плохого в том, что этот код Perl помещает хеш в массив? - PullRequest
3 голосов
/ 14 февраля 2011

Я пытаюсь создать массив хэшей.Это мой код$ 1, $ 2 и т. Д. Сопоставляются с регулярным выражением, и я проверил, что они существуют.

Обновление: Исправлена ​​моя первоначальная проблема, но теперь у меня проблема с тем, что мой массивкогда я помещаю на него элементы, размер больше 1 не увеличивается ...

Обновление 2: Это проблема области действия, поскольку @ACL должны быть объявлены вне цикла.Спасибо всем!

while (<>) {
    chomp;
    my @ACLs = ();

    #Accept ACLs
    if($_ =~ /access-list\s+\d+\s+(deny|permit)\s+(ip|udp|tcp|icmp)\s+(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s+(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s+(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s+(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})(\s+eq (\d+))?/i){

        my %rule = (
            action => $1, 
            protocol => $2, 
            srcip => $3, 
            srcmask => $4, 
            destip => $5, 
            destmask => $6, 
        );
        if($8){
            $rule{"port"} = $8;
        }
        push @ACLs, \%rule;
        print "Got an ACL rule.  Current number of rules:" . @ACLs . "\n";

Массив хэшей, кажется, не становится больше.

Ответы [ 3 ]

6 голосов
/ 14 февраля 2011

Вы нажимаете $rule, которого не существует.Вы хотели отправить ссылку на %rule:

push @ACLs, \%rule;

Всегда запускайте свои программы с use strict; use warnings;.Это остановило бы вас от попытки нажать $rule.

Обновление: В Perl массив может содержать только скаляры.Сложные структуры данных создаются с помощью массива хеш-ссылок.Пример:

my %hash0 = ( key0 => 1, key1 => 2 );
my %hash1 = ( key0 => 3, key1 => 4 );
my @array_of_hashes = ( \%hash0, \%hash1 );
# or: = ( { key0 => 1, key1 => 2 }, { key0 => 3, key1 => 4 ] );

print $array_of_hashes[0]{key1}; # prints 2
print $array_of_hashes[1]{key0}; # prints 3

Пожалуйста, прочитайте Руководство по структурам данных Perl .

2 голосов
/ 14 февраля 2011

Вы очищаете @ACLs каждый раз через цикл. Ваш my неуместен.

2 голосов
/ 14 февраля 2011
my %rule = [...]

push @ACLs, $rule;

Эти две строки относятся к двум отдельным переменным: хешу и скаляру. Они не одинаковы.

Это зависит от того, что вы хотите сделать, но есть два решения:

push @ACLs, \%rule;

вставит ссылку в массив.

push @ACLs, %rule;

будет помещать отдельные значения (как в $key1, $value1, $key2, $value2 ...) в массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...