我正在尝试制作一系列哈希。这是我的代码。 $ 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";
哈希数组似乎没有变得更大。
答案 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
答案 1 :(得分:2)
my %rule = [...]
push @ACLs, $rule;
这两行指的是两个独立的变量:散列和标量。它们不一样。
这取决于你正在做什么,但有两种解决方案:
push @ACLs, \%rule;
会将引用推送到数组中。
push @ACLs, %rule;
会将各个值(如$key1
,$value1
,$key2
,$value2
...)推送到数组中。
答案 2 :(得分:2)
每次循环都会清除@ACLs
。您的my
放错了地方。