如何将Perl变量中包含的IP地址分配给哈希

时间:2017-02-24 18:39:02

标签: perl variables hash

我有一个变量,它包含一个IP地址,以及与该IP地址一起使用的URL,在一个名为$ holder的Perl变量中。我正在尝试填充名为%HOSTNAMES的哈希。 $ holder包含:100.20.31.00, ThisBigSite-Fun。我试过了:

%HOSTNAME = $holder;

但它给了我错误的键值对。有没有更好的方法将多值变量分配给哈希?

# lines contained a list of IP, URL-Addresses
my %HOSTNAME; 
foreach my $n (@lines) { 
  my $holder = (splice(@lines,0,1)); 
  %HOSTNAME = $holder;
}

2 个答案:

答案 0 :(得分:1)

假设你有一个字符串' 100.20.31.00,ThisBigSite-Fun'并且你想把它变成一个哈希,其中ip是键,主机名是它看起来像这样的值:

my ($ip, $host) = split /,\s*/, $your_string;
$HOSTNAME{$ip} = $host

或者如果您想要反过来

$HOSTNAME{$host} = $ip

请注意,当您的哈希值%hostname访问密钥时,您需要使用$

答案 1 :(得分:0)

您当前的方法存在几个问题:

my %HOSTNAME; 
foreach my $n (@lines) { 
  my $holder = (splice(@lines,0,1)); 
  %HOSTNAME = $holder;
}
  1. 没有use strict;use warnings;
  2. 保存来自$n数组(当前行)的当前元素的
  3. @lines完全被忽略。而是在每次迭代时,将第一个元素从@lines中删除并将其存储在$holder
  4. 如果你在循环完成后检查%HOSTNAME,那么%HOSTNAME的值会在循环的每次迭代中被覆盖,它只有一个条目(最后分配的条目)
  5. 正确的实现会解析字符串中的IP地址和主机名,然后将它们(作为不同的键)分配到%HOSTNAME

    use strict;
    use warnings;
    
    use Data::Dumper;
    
    my %HOSTNAMES;
    my @lines = (
      '100.20.31.00, ThisBigSite-Fun',
      '100.20.31.02, ThisBigSite-Fun2',
      '100.20.31.03, ThisBigSite-Fun3',
      '100.20.31.04, ThisBigSite-Fun4',
      '100.20.31.05, ThisBigSite-Fun5',
    );
    
    foreach my $line (@lines) {
      my ($ip, $host) = split /,\s*/, $line;
    
      $HOSTNAMES{$ip} = $host;
    }
    
    print Dumper \%HOSTNAMES;
    #$VAR1 = {
    #          '100.20.31.00' => 'ThisBigSite-Fun',
    #          '100.20.31.03' => 'ThisBigSite-Fun3',
    #          '100.20.31.05' => 'ThisBigSite-Fun5',
    #          '100.20.31.02' => 'ThisBigSite-Fun2',
    #          '100.20.31.04' => 'ThisBigSite-Fun4'
    #        };