# импорт базовых библиотек use strict; use warnings; use utf8; use v5.28; # настройка модулей библиотек use open qw( :std :encoding(UTF-8) ); # импорт внешних библиотек use DBI; # импорт конкрентых модулей внешних библиотек use Data::Dumper; # ------------------- Общие параметры --------------------------- my $dbi_info = 'dbi:Pg:dbname=postgres;host=localhost;port=5432'; my $db_username = 'postgres'; my $db_password = '0000'; my $insert_log_template = 'INSERT INTO log (created,int_id,str,address) values (?,?,?,?)'; my $insert_message_template = 'INSERT INTO message (created,id,int_id,str) values (?,?,?,?)'; my $regex_for_get_id = qr( id=(\S*) ?); my $regex_get_address_for_log_with_blackhol = qr( \<(.*\@.*)\> ); my $regex_get_address_for_log_without_blackhol = qr( (\S*\@\S*) ); my $file_path = "log/out"; # ------------------- ------------- --------------------------- sub _get_id { my $str = shift; if ( $str =~ /$regex_for_get_id/ ) { return $1; } return; } sub _get_address { my $str = shift; if ( $str =~ /:blackhole:/ ) { $str =~ /$regex_get_address_for_log_with_blackhol/; return $1; } else { $str =~ /$regex_get_address_for_log_without_blackhol/; return $1; } } sub _parce_row_log { my $row = shift; chomp($row); my @s_row = split( " ", $row ); my $created = join( " ", @s_row[ 0, 1 ] ); my $int_id = $s_row[2]; my $str = join( " ", @s_row[ 2 ... $#s_row ] ); my $flag = $s_row[3]; return $created, $int_id, $str, $flag; } sub create_row_in_table_log { my ( $dbh, $created, $int_id, $str ) = @_; my $address = _get_address($str); $dbh->do( $insert_log_template, undef, ( $created, $int_id, $str, $address ) ); return 1; } sub create_row_in_table_message { my ( $dbh, $created, $int_id, $str ) = @_; my $id = _get_id($str); if ($id) { $dbh->do( $insert_message_template, undef, ( $created, $id, $int_id, $str ) ); } else { my $address = _get_address($str); $dbh->do( $insert_log_template, undef, ( $created, $int_id, $str, $address ) ); } return 1; } sub process_log { my ( $dbh, $path_to_log ) = @_; open( my $fh, "<:encoding(UTF-8)", $path_to_log ) or die "We can't open file: ", $!; while ( my $row = <$fh> ) { my ( $created, $int_id, $str, $flag ) = _parce_row_log($row); if ( $flag eq "<=" ) { create_row_in_table_message( $dbh, $created, $int_id, $str ); } else { create_row_in_table_log( $dbh, $created, $int_id, $str ); } } return 1; } my $dbh = DBI->connect( $dbi_info, $db_username, $db_password, { postgres_enable_utf8 => 1, RaiseError => 1 } ); print( process_log( $dbh, $file_path ) ); exit(0);