use strict; use warnings; use Data::Dumper; my $str = 'May 16 11:17:12 system app: [id:id:id] Message [Class] [Priority:] {TCP} 111.1.1.64:1863 -> 222.2.2.155:55527'; # no need to use $1 $2 etc. when you can name them ;) my ($mon,$day,$time,$app,$id,$msg,$proto,@ip) = $str =~ / # example match (\S+)\s+ # May (\S+)\s+ # 16 (\S+)\s+ # 11:17:12 ([^:]+):\s+ # system app (\S+)\s+ # [id:id:id] ([^\{]+) # Message [Class] [Priority] (\{[^\}]+\})\s+ # {TCP} (\S+) # 111.1.1.64:1863 \s+\-\>\s+ # (skip ->) (\S+) # 222.2.2.155:55527 /x; print "$mon, $day, $time, $app, $id, $msg, $proto, @ip\n";