2012-02-25 11 views
0

IPアドレスをperlを使ってファイルを使ってホスト名に変換しようとしています(ソケット機能は組み込まれていません)。 私のファイルには、次のようになります。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'と' Print Dumper(\%your_hash) 'を使ってください)。 – Mat

+0

複数のホスト名を1つのIPでサポートしたいのですか? – kupson

+0

あなたの質問を得ることができませんでした、ごめんなさい:「ハッシュはいつも戻ってくる」ということはどういう意味ですか?あなたのコードはうまくいくようです:ファイルを行単位で調べて、マップを埋めていきます。 – raina77ow

答えて

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