my $ports = '(?:'.join('|', @win_ports).')'; while () { print if ( m#$regex/$ports#o ); } #### my $atom = qr/[1,2]?\d{1,2}/; my @ports_win = qw( 135 137 139 445 1025 1433 1434 ); my @ports_trojan = qw( 114 15118 4899 ); my $file = 'C:\fw.log'; my $ports = '('.join('|',@ports_win, @ports_trojan).')'; my $ip = qr#$atom\.$atom\.$atom\.$atom/$ports#; my %lines = (); open LOG, '<', $file or die "Can't read from $file : $!"; while ( my $line = ) { if ( $line =~ m/$ip/o ) { push ( @{$lines{$1}}, $line ); } } foreach my $port ( 'WINDOWS', @ports_win, 'TROJAN', @ports_trojan ) { print "\n\n$port\n-------\n",@{$lines{$port}||[]}; }