【问题标题】:Convert IP to hostname from a file with perl使用 perl 从文件将 IP 转换为主机名
【发布时间】:2012-02-25 23:04:01
【问题描述】:

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

【问题讨论】:

  • 您确定哈希包含您所说的内容吗? (使用Data::Dumperprint Dumper(\%your_hash) 查看其内容。)您所拥有的看起来不错。
  • 也许您想用一个 IP 支持多个主机名?
  • 未能得到您的问题,抱歉:您所说的“哈希总是返回”是什么意思?您的代码似乎很合法:您正在逐行浏览文件,填写地图...
  • 另请注意,如果不是chomping line,您最终会在每个主机名的末尾加上\n。这可能不是你想要的。
  • 最好只写my ($ip, $hostname) = split;,因为这样可以避免chomp输入记录的需要,并且还可以处理任何前导和尾随空格。

标签: perl


【解决方案1】:

我认为您正在寻找的是一个脚本,用于在给定 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;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-31
    • 2012-05-20
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    • 2015-04-12
    • 2011-09-15
    • 2019-05-26
    相关资源
    最近更新 更多