我正在尝试使用perl通过文件将IP转换为主机名(不使用内置的Socket功能)。 我的文件看起来像这样:
192.168.1.1 firewall
192.168.2.4 wifi
192.168.3.10 switch
我的代码:
use strict;
use warnings;
my $input_dns_file='./file';
our %ip2host_hash;
sub read_dns_file()
{
open(DNS_FILE,'<',$input_dns_file) or die;
while ( my $line=<DNS_FILE> ){
my ($ip,$hostname) = split(/\s+/,$line,2);
$ip2host_hash{$ip} = $hostname;
}
问题是哈希总是返回文件的第一行。如何填写哈希%ip2host
以便在输入IP地址时返回每个主机名?
答案 0 :(得分:0)
我认为你要找的是一个脚本,在给定IP的情况下从列表(文件中)中提取主机名。这很简单。这是一个单行:
perl -wle '
$ip = shift;
%list = map split,<>;
print $list{$ip} || "$ip not found";
' 192.168.2.24 list_of_ips
-l
将选择输入并添加换行符(为方便起见)。 map
只会拆分输入列表中的每个元素,因此它适合哈希结构。最后一个语句将打印主机名(如果找到),如果没有,则打印错误。
这是一个脚本:
use strict;
use warnings;
my $ip = shift;
my $file = "list_of_ips";
open my $fh, '<', $file or die $!;
my %list = map split, <$fh>;
print $list{$ip} || "$ip not found\n";
您可能会考虑使用短路,一旦找到匹配就返回。从性能的角度来看,这会更好,特别是对于大型输入文件。
while (<$fh>) {
my ($num, $host) = split;
if ($num eq $ip) {
print $host;
last;
}
}