【问题标题】:how to remove duplicate values and create a new perl hash?如何删除重复值并创建新的 perl 哈希?
【发布时间】:2013-11-09 17:39:56
【问题描述】:
my %hash1 = ( 
               a=>192.168.0.1,
               b=>192.168.0.1,
               c=>192.168.2.2,
               d=>192.168.2.3,
               e=>192.168.3.4,
               f=>192.168.3.4
            );

我有一个上面给出的 perl 哈希。键是设备名称,值是 IP 地址。如何使用 %hash1 创建没有重复 IP 地址(如 %hash2)的哈希? (相同ip的设备被删除)

my %hash2 = ( c=>192.168.2.2, d=>192.168.2.3 );

【问题讨论】:

  • my %hash = { ... } 不会像您认为的那样做。这是错误类型的括号。你想要my %hash = ( ... )。通常情况下,use warnings 会告诉你这个问题。

标签: perl hash perl-data-structures


【解决方案1】:

首先你需要引用你的IP地址,因为192.168.0.1在perl中是V-String,意思是chr(192).chr(168).chr(0).chr(1)
我的变种是:

my %t;
$t{$_}++ for values %hash1; #count values
my @keys = grep
               { $t{ $hash1{ $_ } } == 1 }
           keys %hash1; #find keys for slice
my %hash2;
@hash2{ @keys } = @hash1{ @keys }; #hash slice

【讨论】:

    【解决方案2】:

    怎么样:

    my %hash1 = (
       a=>'192.168.0.1',
       b=>'192.168.0.1',
       c=>'192.168.2.2',
       d=>'192.168.2.3',
       e=>'192.168.3.4',
       f=>'192.168.3.4',
    );
    my (%seen, %out);
    
    while( my ($k,$v) = each %hash1) {
        if ($seen{$v}) {
            delete $out{$seen{$v}};
        } else {
            $seen{$v} = $k;
            $out{$k} = $v;
        }
    }
    say Dumper\%out;
    

    输出:

    $VAR1 = {
              'c' => '192.168.2.2',
              'd' => '192.168.2.3'
            };
    

    【讨论】:

      【解决方案3】:

      使用CPAN模块List::Pairwise的解决方案:

      use strict;
      use warnings;
      use List::Pairwise qw( grep_pairwise );
      use Data::Dumper;
      my %hash1 = (
          a => '192.168.0.1',
          b => '192.168.0.1',
          c => '192.168.2.2',
          d => '192.168.2.3',
          e => '192.168.3.4',
          f => '192.168.3.4'
      );  
      my %count;
      for my $ip ( values %hash1 ) { $count{ $ip }++ }
      my %hash2 = grep_pairwise { $count{ $b } == 1 ? ( $a => $b ) : () } %hash1;
      print Dumper \%hash2;
      

      这很简单。首先,您计算辅助哈希中的 IP。然后,您从List::Pairwise 中使用grep_pairwise 仅选择那些计数为1 的IP。 grep_pairwise 的语法类似于grep:

      my @result = grep_pairwise { ... } @list;
      

      grep_pairwise 的想法是两个两个选择@list 的元素,$a 代表该对的第一个元素,$b 第二个(在本例中为 IP)。 (请记住,哈希计算为列表上下文中的 ($key1, $value1, $key2, $value2, ...) 对的列表)。

      【讨论】:

        猜你喜欢
        • 2023-04-09
        • 2010-11-01
        • 2013-12-20
        • 2018-12-07
        • 1970-01-01
        • 2011-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多