2012-02-25 65 views
0

我想通過使用perl文件(不使用內置的Socket函數)將IP轉換爲主機名。 我的文件看起來像這樣:將IP從一個文件轉換爲主機名用Perl

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

你確定散列包含你所說的嗎? (使用'Data :: Dumper'和'打印Dumper(\%your_hash)'來查看它的內容。)你在那裏看起來很好。 – Mat 2012-02-25 10:40:56

+0

也許你想用一個IP來支持多個主機名? – kupson 2012-02-25 10:42:16

+0

無法得到你的問題,對不起:你的意思是'散列總是返回'?你的代碼看起來很合理:你正在逐行瀏覽文件,填入地圖... – raina77ow 2012-02-25 10:42:50

回答

0

我想你正在尋找的是一個腳本,從列表(文件)中提取主機名,給定的IP。這很簡單。這裏是一個班輪:

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

-l會的Chomp的輸入,並添加一個新行打印(爲方便起見)。 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; 
    } 
} 
相關問題