哈希表:有效地计数与键匹配的哈希值



我想检查ip -j在perl中添加show eno1的json输出。我想数一下网卡有多少ipv4地址。我仍然需要ipv6信息,所以我想避免运行两次/usr/bin/ip命令,然后使用-4和-6标志。

现在我可以像这样访问ip信息:$nic->{addr_info}[0]->{local}对于每个条目,$nic->{addr_info}[$ip_info_index]->{family}将给出IP类型(inet或inet6)

在大多数情况下,我的表中有2个条目:一个用于v4,一个用于v6,但有时我有2个v4条目a,并想发出警告"不支持";

$nic->{addr_info}[$ip_info_index]->{family}将给出条目的类型。

是否有一些优雅的技巧使用映射和标量来计算有多少$nic->{addr_info}[$ip_info_index]->{family}等于'inet'(而不是'inet6')

(我可以遍历$ip_info_index,并在每次看到'inet'时增加一个计数器,但这似乎不太优雅)。

DB<3> p Dumper($nic)
$VAR1 = {
'txqlen' => 1000,
'address' => '00:26:b9:7d:c0:ee',
'broadcast' => 'ff:ff:ff:ff:ff:ff',
'link_type' => 'ether',
'group' => 'default',
'mtu' => 1500,
'qdisc' => 'mq',
'flags' => [
'BROADCAST',
'MULTICAST',
'UP',
'LOWER_UP'
],
'operstate' => 'UP',
'ifindex' => 2,
'addr_info' => [
{
'valid_life_time' => 30949,
'preferred_life_time' => 30949,
'label' => 'eno1',
'family' => 'inet',
'scope' => 'global',
'noprefixroute' => bless( do{(my $o = 1)}, 'JSON::PP::Boolean' ),
'prefixlen' => 24,
'local' => '172.16.59.72',
'broadcast' => '172.16.59.255',
'dynamic' => $VAR1->{'addr_info'}[0]{'noprefixroute'}
},
{
'family' => 'inet6',
'local' => 'fe80::226:b9ff:fe7d:c0ee',
'valid_life_time' => 4294967295,
'preferred_life_time' => 4294967295,
'prefixlen' => 64,
'scope' => 'link'
}
],
'ifname' => 'eno1'
};

对于addr_info表,我想计算有多少哈希有'family' =>'inet' ('inet6'也一样)。如果设置了多个ipv4或ipv6,我需要失败。如果您想在Linux系统上进行测试,则可以这样获取$nic:

my $ip_addr_output = `LC_ALL=C /sbin/ip -j addr 2>/dev/null`;

我想这就是你想要的。

$nic->{addr_info}是对一个数组的引用,其中每个元素描述一个附加到接口的IP地址。

所以@{ $nic->{addr_info} }取消了这个数组的引用,所以你现在可以把它传递给需要数组或列表的函数。其中一个这样的函数是grep,它过滤列表并只返回列表中满足某些条件的元素。因此,我们可以使用以下命令获取IPv4地址列表:

grep { $_->{family} eq 'inet' } @{ $nic->{addr_info} }

如果你在标量上下文中调用' grep ',它不会给你列表,它会给你列表中的项数。

scalar grep { $_->{family} eq 'inet' } @{ $nic->{addr_info} }

你可以这样写:

say "$nic->{ifname} : ", scalar grep { $_->{family} eq 'inet' } @{ $nic->{addr_info} };

最新更新