2017-05-18 1 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

댓글을 잘 작성하지 마세요. [edit] 게시물을 올려주세요. – Sobrique

답변

3

겉보기에 문제가있는 것은 포트가 캡처되는 위치와 해시 업데이트가 확실하지 않다는 것입니다. $LogRecord =~ 라인 패턴을 캡처되어 - - $1$2에 무슨 일

while 루프가 한 번에 파일 한 줄을 반복하고 값을 캡처합니다.

$2push으로 해시에 추가 할 수있는 항목입니다.

그러나 더 나은 스타일이므로 어휘 파일 핸들을 사용하는 것처럼 스타일을 현명하게 변경 한 몇 가지 사항이 있습니다.

#!/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; 

이렇게 해시가 만들어졌습니다.

그러나하고 출력하기에 올 때 :

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

당신이 그들을 정렬 원한다면, 당신은 sort를 사용하여이 작업을 수행해야합니다.

지금 sort은 매우 영리한 기능이지만 기본적으로 영숫자 정렬입니다. 그건 ... IP 주소 나 포트 번호와 관련하여 실제로 유용하지는 않습니다. 왜냐하면 IP 주소 나 포트 번호를 수치 적으로 정렬하기를 원하기 때문입니다. 쉬운 대답은 Sort::Naturally이고 nsort을 사용하십시오.

그러나 - sort은 상대 위치에 따라 -1, 0, 1을 반환하는 함수 (기본값은 cmp)를 취합니다.

그래서 다음과 같을 수 'IP에 의해'정렬 :

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

당신에게주기 :

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

관련 문제