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

时间:2012-02-25 10:34:01

标签: perl

我正在尝试使用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地址时返回每个主机名?

1 个答案:

答案 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;
    }
}