Arrays 什么';这段Perl代码将哈希推送到数组上有什么不对?

Arrays 什么';这段Perl代码将哈希推送到数组上有什么不对?,arrays,perl,hash,Arrays,Perl,Hash,我正在尝试创建一个哈希数组。这是我的密码。$1、$2等是从正则表达式匹配的,我已经检查过它们是否存在 更新:修复了我最初的问题,但现在我遇到的问题是,当我将项目推到阵列上时,阵列的大小没有超过1 更新2:这是一个范围问题,因为@ACL需要在循环之外声明。谢谢大家 while (<>) { chomp; my @ACLs = (); #Accept ACLs if($_ =~ /access-list\s+\d+\s+(deny|permit)\s+(

我正在尝试创建一个哈希数组。这是我的密码。$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";
while(){
咀嚼;
my@ACLs=();
#接受ACL
如果($0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 10 10 10 10 10 10 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10+(\d{1,3}\.\d{1,3}\.\d{1,3}.\d{1,3})(\s+eq(\d+))/i){
我的%rule=(
动作=>1美元,
协议=>2美元,
srcip=>3美元,
srcmask=>4美元,
destp=>5美元,
destmask=>6美元,
);
如果有的话(8美元){
$rule{“port}=$8;
}
推送@ACL,\%规则;
打印“已获取ACL规则。当前规则数:“.@ACL”。\n”;

哈希数组似乎没有变大。

您正在推送不存在的
$rule
。您想推送对
%rule
的引用:

push @ACLs, \%rule;
始终使用
使用严格;使用警告;
启动程序。这会阻止您尝试推送
$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
请仔细阅读

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

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

push @ACLs, \%rule;
将引用推入数组

push @ACLs, %rule;

将推送各个值(如
$key1
$value1
$key2
$value2
。)进入数组。

您每次通过循环都在清除
@acl
。您的
我的
放错了地方。

如何将数据本身推送到数组中?我每次都在更新%规则,所以我需要推送数据而不是引用。@Stewart:您能指定最终期望的结构类型吗?
%rule
是一个散列,而
@ACLs
是一个数组,因此只要按下
%rule
的值,就会丢失键中的信息。最后,我希望@ACLs是一个散列数组。散列是键/值对的列表。因此,生成的数据结构看起来像一个数组table@Stewart:这就是表示哈希数组的方式我已经用更多信息更新了我的答案。(我假设
@acl
在原始代码中处于更高的范围。)每次在循环中执行此代码时,
my%规则
应该会得到新的内存分配,对吗?由于某种原因,我的数组不会变得更大,即使我一直将哈希值推到数组上。@OP:编辑的代码仍然有问题吗?如果没有,请还原。是的,我仍然有更新的代码的问题,您需要删除它在
while
循环外重新
@acl
。在循环内使用
my
每次通过声明一个新数组。
push @ACLs, %rule;