我有一个变量,它包含一个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;
}
答案 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;
}
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'
# };