perl如何删除顶级/主哈希键,包括哈希值的哈希值

perl如何删除顶级/主哈希键,包括哈希值的哈希值,perl,hash,hashmap,hashtable,Perl,Hash,Hashmap,Hashtable,我有一个从子程序得到的散列值的散列。粘贴下面的代码块 sub check_interfaces() my @interfaces = IO::Interface::Simple->interfaces; my ($ip, $subnet, $dscp) = @_; my %check_config = ( "ip" => $ip, "subnet" => $subnet, "dscp" => $dscp ); foreach my $if (@i

我有一个从子程序得到的散列值的散列。粘贴下面的代码块

sub check_interfaces()
my @interfaces = IO::Interface::Simple->interfaces;
my ($ip, $subnet, $dscp) = @_;
my %check_config = (
    "ip" => $ip,
    "subnet" => $subnet,
    "dscp" => $dscp
);

foreach my $if (@interfaces) {
    if (not defined $if->address) {
        next;
    }
    %check_configs = ( config => \%check_config );
    my %interface = ($if, $if->address);
    if ($check_configs{config}{ip} && $check_configs{config}{ip} =~ /$interface{$if}/) {
        print "$check_configs{config}{ip} already configured\n\n";
        delete $check_configs{config}{ip};
        delete $check_configs{config}{subnet};
        delete $check_configs{config}{dscp};
        delete $check_configs{config};
    }
}
print Dumper %check_configs;
这是给我的输出

root@server:/l3dsr# perl test.pl start
10.75.21.23 already configured

$VAR1 = 'config';
$VAR2 = {};
$VAR1 = 'config';
$VAR2 = {
      'dscp' => '2',
      'ip' => '10.75.130.24',
      'subnet' => '255.255.255.255'
    };
我试图删除主散列键,但它没有被删除。如果我不删除,输出将是

10.75.21.23 already configured

$VAR1 = 'config';
$VAR2 = {
      'dscp' => '2',
      'ip' => '10.75.21.23',
      'subnet' => '255.255.255.255'
    };
$VAR1 = 'config';
$VAR2 = {
      'dscp' => '2',
      'ip' => '10.75.130.24',
      'subnet' => '255.255.255.255'
    };
我想做的是去掉这一大块散列

$VAR1 = 'config';
$VAR2 = {
      'dscp' => '2',
      'ip' => '10.75.21.23',
      'subnet' => '255.255.255.255'
    };
通过做

            delete $check_configs{config}{ip};
            delete $check_configs{config}{subnet};
            delete $check_configs{config}{dscp};
            delete $check_configs{config};
但它并没有像预期的那样发挥作用。我做错了什么

在删除后添加了转储程序,但没有打印任何内容。但是,我正在打印密钥,您可以在这里看到密钥的重复出现

    if ($check_configs{config}{ip} && $check_configs{config}{ip} =~ /$interface{$if}/) {
        print "$check_configs{config}{ip} already configured\n\n";
        delete $check_configs{config}{ip};
        delete $check_configs{config}{subnet};
        delete $check_configs{config}{dscp};
        delete $check_configs{config};
        print Dumper %check_configs;
    }
}
print keys %check_configs;
输出::

root@server:/l3dsr# perl test.pl start
10.75.21.23 already configured

configconfigroot@server:/l3dsr# 
root@cdn-fe13:/l3dsr# perl test.pl start
10.75.21.23 already configured

$VAR1 = [
      "config"
    ];
$VAR1 = {
      "config" => {}
    };
$VAR1 = [
      "config"
    ];
$VAR1 = {
      "config" => {
                    "dscp" => 2,
                    "ip" => "10.75.130.24",
                    "subnet" => "255.255.255.255"
                  }
    };
博罗丁: 与

$Data::Dumper::Useqq = 1;
print Dumper [ keys %check_configs ];
输出::

root@server:/l3dsr# perl test.pl start
10.75.21.23 already configured

configconfigroot@server:/l3dsr# 
root@cdn-fe13:/l3dsr# perl test.pl start
10.75.21.23 already configured

$VAR1 = [
      "config"
    ];
$VAR1 = {
      "config" => {}
    };
$VAR1 = [
      "config"
    ];
$VAR1 = {
      "config" => {
                    "dscp" => 2,
                    "ip" => "10.75.130.24",
                    "subnet" => "255.255.255.255"
                  }
    };
更新::

如果在delete$check\u配置之后添加delete

            delete $check_configs{config}{subnet};
            delete $check_configs{config}{dscp};
            delete $check_configs{config};
        }
    }
    if (!keys $check_configs{config}) {
        delete $check_configs{config};
    }
    print  keys %check_configs ;
它删除空的配置键。但是,如果我将其添加到上面,如

    if (!keys $check_configs{config}) {
        delete $check_configs{config};
    }
    if ($check_configs{config}{ip} && $check_configs{config}{ip} =~ /$interface{$if}/) {....

它不起作用。我不知道它是从哪里得到空钥匙的

使用了以下代码

        delete $check_configs{config}{subnet};
        delete $check_configs{config}{dscp};
        delete $check_configs{config};
        }
}
if (!keys $check_configs{config}) {
        delete $check_configs{config};
        }
print  keys %check_configs ;

您确定满足了
if
条件并且执行了
删除操作吗?是。它正在删除数据,但主/顶级密钥配置不会被删除,即使我指定delete$check_configs{config};我想知道为什么delete$check_configs{config}没有删除顶级键及其所有子值。无法复制:
perl-MData::Dumper-we'%c=(config=>{a=>11});删除$c{config};打印转储程序\%c;'我担心您没有显示真正的代码。你在问题中提出的内容无法编译。要删除该散列元素,只需
delete$check\u configs{config}
。删除
ip
子网
dscp
子键没有意义。请在散列引用上使用
转储程序
,如下面的
打印转储程序\%检查\u configs
,不要使用
()
对子例程进行原型键入。更新:在foreach循环后添加条件时显示所需输出。但如果我把它放在里面,它就不起作用了。我不确定它从哪里得到空哈希。。