Forum Webscript.Ru
Программирование => Perl => Тема начата: MasteRaf от 03 Июля 2007, 17:49:52
-
Есть текстовый файл с инфой:
-----\\\\------
.................tcp 10.64.66.4(0) -> 89.111.180.41(0)
-----\\\\------
в скобках номер порта. Надо вывести инфу (лучше в файл), какие использовались порты (без повтора желательно). Для гуру наверное это несложно, 5 сек. Помогите (или подскажите)
P.S. Вчера впервые узнал, что такое Perl
-
Что-то вроде этого:
#!/usr/bin/perl -w
use strict;
my $fileDlyaChteniya = \'1.txt\';
my $fileDlyaZapisi = \'2.txt\';
my %ports;
open FHR, $fileDlyaChteniya or die "Can\'t open $fileDlyaChteniya: $!\\n";
while ( ) {
$ports{$1}++ while /\\((\\d+[^)])/g;
}
close FHR or die "Can\'t close $fileDlyaChteniya: $!\\n";
open FHW, "> $fileDlyaZapisi" or die "Can\'t open $fileDlyaZapisi: $!\\n";
while ( my($port,$q) = each %ports ) {
print FHW "$port => $q\\n";
}
close FHW or die "Can\'t close $fileDlyaZapisi: $!\\n";
-
Спасибо, vladsu!
while ( my($port,$q) = each %ports ) {
print FHW "$port => $q\\n";
}
здесь просто опечатка? - вместо $port правильно писать $ports ???
Если не сложно, объясни вот это подробно
$ports{$1}++ while /\\((\\d+[^)])/g;
или подскажи, в каких разделах учебников это можно найти (особенно /\\((\\d+[^)])/g )
-
MasteRaf:
здесь просто опечатка? - вместо $port правильно писать $ports ???
А Вы не пробовали сначала запустить? Нет, здесь нет опечаток.
MasteRaf:
или подскажи, в каких разделах учебников это можно найти (особенно /\\((\\d+[^)])/g )
Здесь сразу несколько тем.
Это $ports{$1}
читайте в разделе про хеши.
Об этом ++
читайте в разделе про операции.
Об этом while
читайте в разделе о циклах и в разделе об укороченной записи. В привычном для Вас формате это будет выглядеть так
while ( /\\((\\d+[^)])/g ) {
$ports{$1}++;
}
А это /\\((\\d+[^)])/g
регулярное выражение. Которое начинается символом /, далее ищет в переменной $_ открывающую скобку за что отвечает \\(, сразу после скобки ищутся любые цифры за что отвечает \\d+ и цифры ищутся до тех пор пока не встретится закрывающая скобка [^)], все найденные цифры сохраняются в переменной $1, за это отвечает другая пара скобок (), далее следует окончание регекспо /, а буква g нужна для того, чтобы сообщить компилятору, чтобы он не прекращал поиск в переменной $_ пока не будет достигнут её конец.
И ещё нужно посмотреть тему о спец. переменных, в данном случае о $_, даннай переменная заполняется в строке while ( ) {.
Вроде всё.
Совет. Если же Вы решили изучить Перл, то лучше читать книгу с начала, а не урывками.
-
Пасиб, vladsu.
Появилась модифицированная задача - теперь порты в текстовом файле не отделены скобками, а просто пробелами. Так вот, SRCport идет после 16-го пробела, а DST после 17-го. Как бы их рвануть оттуда допустим по тому же регулярному выражению?
-
Пример пожалуйста.
-
2007-06-29 14:15:00 456778746 0011:00:48:45,048 82.200.22.33 1 86 0011:00:48:28,628 0011:00:48:28,628 0 0 82.176.121.61 82.200.22.43 0.0.0.0 1 0 49151 46303 17 32 16 0 0 0 0
(даже не пробел, а табуляция наверное между ними)
-
49151 SRCport
46303 DST
-
use strict;
my $fileDlyaChteniya = \'1.txt\';
my $fileDlyaZapisi = \'2.txt\';
my %ports;
open FHR, $fileDlyaChteniya or die "Can\'t open $fileDlyaChteniya: $!\\n";
while ( ) {
map {$ports{$_}++} ((split /\\s+/,$_))[17,18];
}
close FHR or die "Can\'t close $fileDlyaChteniya: $!\\n";
open FHW, "> $fileDlyaZapisi" or die "Can\'t open $fileDlyaZapisi: $!\\n";
while ( my($port,$q) = each %ports ) {
print FHW "$port => $q\\n";
}
close FHW or die "Can\'t close $fileDlyaZapisi: $!\\n";