这个Perl代码将哈希值推送到数组上有什么问题?

时间:2011-02-13 22:43:10

标签: arrays perl hash

我正在尝试制作一系列哈希。这是我的代码。 $ 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 个答案:

答案 0 :(得分:6)

您正在推送不存在的$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 Data Structures Cookbook

答案 1 :(得分:2)

my %rule = [...]

push @ACLs, $rule;

这两行指的是两个独立的变量:散列和标量。它们不一样。

这取决于你正在做什么,但有两种解决方案:

push @ACLs, \%rule;

会将引用推送到数组中。

push @ACLs, %rule;

会将各个值(如$key1$value1$key2$value2 ...)推送到数组中。

答案 2 :(得分:2)

每次循环都会清除@ACLs。您的my放错了地方。