使用perl将IP从文件转换为主机名

使用perl将IP从文件转换为主机名,perl,Perl,我正在尝试使用perl(不使用内置套接字函数)通过文件将IP转换为主机名。 我的文件如下所示: 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,'<',$in

我正在尝试使用perl(不使用内置套接字函数)通过文件将IP转换为主机名。 我的文件如下所示:

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;
        }
使用严格;
使用警告;
我的$input_dns_file='/文件';
我们的%ip2host\u散列;
子读取dns文件()
{

open(DNS_FILE,“我想你要找的是一个脚本,在给定IP的情况下,从列表(文件)中提取主机名。这很简单。这里有一行代码:

perl -wle '
     $ip = shift; 
     %list = map split,<>; 
     print $list{$ip} || "$ip not found";
' 192.168.2.24 list_of_ips

你可以考虑使用一个短路,一旦找到匹配就返回。这将从性能的角度来看更好,特别是对于大的输入文件。

while (<$fh>) {
    my ($num, $host) = split;
    if ($num eq $ip) {
        print $host;
        last;
    }
}
while(){
我的($num,$host)=拆分;
如果($num eq$ip){
打印$host;
最后;
}
}

您确定哈希包含您所说的内容吗?(使用
Data::Dumper
print Dumper(\%your\u hash)
查看其内容。)您拥有的看起来不错。也许您想用一个IP支持多个主机名?未能回答您的问题,抱歉:您所说的“哈希总是返回”是什么意思?您的代码似乎很合法:您正在逐行浏览文件,填充地图…还请注意,如果不
chomp
ing
line
,您将以结束de>\n
在每个主机名的末尾。这可能不是您想要的。最好只编写
my($ip,$hostname)=split;
,因为这样可以避免
chomp
对输入记录进行压缩,并且可以处理任何前导和尾随空格。
while (<$fh>) {
    my ($num, $host) = split;
    if ($num eq $ip) {
        print $host;
        last;
    }
}