2017-05-18 15 views
0

学校の譲渡に関する質問が許可されているかどうかわかりません。私は、私がやるべきことを理解したいのですが、私のためにはしません。たぶん私は何かが欠けているので、それは私の目の前にありますが、とにかくそれは古い課題に基づいていましたが、私はこのクラスを逃してしまっていました。今は壁に乗っています。配列をハッシュテーブルにプッシュします。このようなものを使って。Perlでは、配列をハッシュの値としてどのように格納できますか?

push @{$hash_table{$hash_key}}, $port 

し、それらを保存しながら、ポートをカウントし、その後、ハッシュ

while (($key , $value) = each (%hash)) { 
    print “$key scanned @{$value}” 
} 

の内容を印刷するために、私は結果をソートしたい場合、私は

< foreach $key (keys (%hash)) { 
} 

使用します私が持っている現在のコードは、/ iNext-DROP/ の文字列を検索し、提供されたログファイルを使用しています。私は私の人生のために傾ける上記のコードを追加する正しい場所を見つける

use warnings; 
my $LogRecord; 
my $LogRecordCount; 
open LOGFILE, "sample.log.txt" or die "couldn't open sample.log.txt"; 
while ($LogRecord = <LOGFILE>) { 
if ($LogRecord =~ /INext-DROP/) { 
    $LogRecordCount ++; 
    $LogRecord =~ /(SRC=[0-9\.]*).*(SPT=[0-9\.]*)/; 
    $source=$1; 
    $sport=$2; 
print "$source$sport"; 
print substr($LogRecord , 0 , $ARGV[1]) , "\n" if $ARGV[1]; 
} 
} 
print "The file contained $LogRecordCount records" if $ARGV[1]; 
close LOGFILE; 

ここにコメント付きの古いコードの画像です。 Old Code -- not much has changed since I keep going back after it doesn't work

+0

は - 同じ規則は、しかし '実際の' 質問の場合と同様に適用されます。例えば私たちはあなたの仕事(宿題など)をあなたのためにしません。問題を理解し、作業中のコードを修正するのに役立ちます。 – Sobrique

+0

貼り付けられたログのスニペット(スクリーンショットから再構築する必要がないため)はテストに役立ちます。 – Sobrique

+0

コメントはあなたの投稿をうまくフォーマットしないでください。 – Sobrique

答えて

3

問題があるように思われるのは、ポートがキャプチャされている場所とハッシュ更新がわからないことです。 $LogRecord =~ラインは、パターンをキャプチャしていること - - $1$2に何が起こっている

は、あなたのwhileループが一度にファイル1行を反復し、値をキャプチャされています。

そして$2は、pushでハッシュに追加できるものです。

しかし、それはより良いスタイルであるため、レキシカルファイルハンドルを使用するようなスタイルを変更した点がいくつかあります。

#!/usr/bin/env perl 
use warnings; 
use strict; 

#because it makes debugging easier. 
use Data::Dumper; 

my $LogRecordCount; 

#declare some hashes; 
my %ports_from; 
my %ips_that_used; 

open my $logfile, "sample.log.txt" or die "couldn't open sample.log.txt"; 
while (my $line = <$logfile>) { 
    #matches 'current line' - skips stuff that doesn't match. 
    next unless $line =~ /INext-DROP/; 
    #increment count. 
    $LogRecordCount++; 

    my ($source, $src_port) = $line =~ m/SRC=([0-9\.]+).*SPT=([0-9]+)/; 
    print "$source$sport"; 

    #not sure what this is doing, so I have left it in. 
    print substr($line , 0 , $ARGV[1]) , "\n" if $ARGV[1]; 

    push @{$ports_from{$source}}, $src_port; 
    push @{$ips_that_used{$src_port}}, $source; 
} 
print "The file contained $LogRecordCount records" if $ARGV[1]; 
close $logfile; 

print Dumper \%ports_from; 
print Dumper \%ips_that_used; 

これでハッシュが構築されました。

しかし、それはoutputingに来る:

foreach my $ip (keys %ports_from) { 
    print "$ip: ", join (" ", @{$ports_from{$ip}}) ,"\n" 
} 

あなたがそれらを並べ替えしたい場合は、sortを使用してこれを実行する必要があります。

今、sortはかなり巧妙な機能ですが、デフォルトでは英数字でソートされています。それは... IPアドレスやポート番号に関しては実際にはそれほど有用ではありません。なぜなら、それらをより数値的に並べ替えたいからでしょう。簡単な答えはSort::Naturallyで、nsortを使用してください。

ただし、 - sortは、相対位置に応じて-1,0,1を返す関数(デフォルトはcmp)をとります。

sub by_ip { 
    my @a = split /\./, $a; 
    my @b = split /\./, $b; 
    foreach my $octet (@a) { 
     my $comparison = $octet <=> shift (@b); 
     return $comparison if $comparison; 
    } 
    return 0; 
} 

そして、あなたができます:

foreach my $ip (sort by_ip keys %ports_from) { 
    print "$ip: ", join (" ", sort { $a <=> $b } @{$ports_from{$ip}}),"\n"; 
} 

あなたを与える:

IPツー考える
24.64.208.134 : 24128 24128 24128 
71.228.199.109 : 37091 
72.197.8.56 : 9258 
75.117.31.43 : 3122 
99.248.20.48 : 48725 
207.68.178.56 : 80 

をので、次のようになります。 'IPによって' ソート

重複は存在するが、ハッシュの代わりにハッシュを使用してポートの頻度を数えるだけの方がよいかもしれないfアレイ。

$count_ports_from{$source}{$src_port}++; 

そして:

foreach my $ip (sort by_ip keys %count_ports_from) { 
    print "$ip: "; 
    foreach my $port_num (sort { $count_ports_from{$a} <=> $count_ports_from{$b} } 
     keys %{ $count_ports_from{$ip} }) 
    { 
     print "\t $port_num : $count_ports_from{$ip}{$port_num}\n"; 
    } 
} 

は次のように何かを与える:あなたは絶対に割り当てについて質問を許可している

24.64.208.134 :  24128 : 3 
71.228.199.109 :  37091 : 1 
72.197.8.56 : 9258 : 1 
75.117.31.43 : 3122 : 1 
99.248.20.48 : 48725 : 1 
207.68.178.56 :  80 : 1 
+0

うわあ、この説明に助けてくれてありがとう、私は今ここから大丈夫だと思う。 –

+0

私はそれを実際に並べ替えることは、実際には良いことよりも私にとって害が大きかったと思います。おそらく、 –

+1

。デフォルトの「並べ替え」は、IPや数字で聞こえるほど有用ではありません。より具体的なものが必要なことがよくあります。 – Sobrique

関連する問題