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;
}
- 无
use strict;
或use warnings;
。 -
$n
完全忽略了@lines
数组(当前行)的当前元素。相反,在每次迭代中,您将第一个元素从@lines
删除,然后将其存储在$holder
中 - 如果要在循环完成后检查
%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'
# };