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



i具有一个包含IP地址的变量,以及该IP地址随附的URL,在称为$ holder的perl变量中。我正在尝试填充一个名为%HOSTNAMES的哈希。$持有人包含: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;
}

假设您有一个字符串'100.20.31.00,this-bigsite-fun',并且您想将其变成hash,其中ip是键,主机名是它看起来的值这样:

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

,或者如果您想以相反的方式

$HOSTNAME{$host} = $ip

请注意,虽然您的哈希是%hostname,要访问键,您需要使用$

您当前的方法有几个问题:

my %HOSTNAME; 
foreach my $n (@lines) { 
  my $holder = (splice(@lines,0,1)); 
  %HOSTNAME = $holder;
}
  1. use strict;use warnings;
  2. $n完全忽略了@lines数组(当前行)的当前元素。相反,在每次迭代中,您将第一个元素从@lines删除,然后将其存储在$holder
  3. 如果要在循环完成后检查%HOSTNAME,则%HOSTNAME的值在循环的每次迭代中都被覆盖。

正确的实现将从字符串中解析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'
#        };

最新更新