#!/usr/bin/perl use strict; use warnings; use Data::Dumper; use constant STATUS_COMPLETED_RE => qr{ ^string-here \s string-here: \s \((\w+)\) \s #alarm level ([\w|\s]+) \s completed, \s #job completed Total\s (\d+) \sclient\(s\), \s #total clients ( #Details - (\d+) \s # number ([\w|\s\(\)]+) ,|\. # succeed,fail,etc. )* # any number of }xms ; my @sample_str = ('string-here string-here: (alarm_level_5) group5 completed, Total 55 client(s),', 'string-here string-here: (alarm_level_2) group2 completed, Total 22 client(s), 422 succeed,622 fail,911 no_pass.'); my (@data, %stats); for my $line ( @sample_str ) { if (@data = ($line =~ STATUS_COMPLETED_RE )) { print Data::Dumper->Dump([\@data], [qw/*data/]); $stats{level} = shift @data; $stats{group} = shift @data; $stats{total} = shift @data; } else { print "No match\n"; } } print Data::Dumper->Dump([\%stats], [qw/*stats/]); #### C:\perlp>perl try.pl No match @data = ( 'alarm_level_2', 'group2', '22', '622 fail,', '622', 'fail' ); %stats = ( 'group' => 'group2', 'level' => 'alarm_level_2', 'total' => '22' ); C:\perlp>C:\perlp> #### #!/usr/bin/perl use strict; use warnings; use Data::Dumper; use constant STATUS_COMPLETED_RE => qr{ ^string-here \s string-here: \s \((\w+)\) \s #alarm level ([\w\s]+) \s completed, \s #job completed Total\s (\d+) \sclient\(s\), \s? #total clients ((?: #Details - \d+ \s # number [\w\s\(\)]+ [,.] # succeed,fail,etc. )*) # any number of }xms ; my @sample_str = ('string-here string-here: (alarm_level_5) group5 completed, Total 55 client(s),', 'string-here string-here: (alarm_level_2) group2 completed, Total 22 client(s), 422 succeed,622 fail,911 no_pass.'); my (@data, %stats); for my $line ( @sample_str ) { if (@data = ($line =~ STATUS_COMPLETED_RE )) { print Data::Dumper->Dump([\@data], [qw/*data/]); $stats{level} = shift @data; $stats{group} = shift @data; $stats{total} = shift @data; } else { print "No match\n"; } } print Data::Dumper->Dump([\%stats], [qw/*stats/]); #### C:\perlp>t1.pl @data = ( 'alarm_level_5', 'group5', '55', '' ); @data = ( 'alarm_level_2', 'group2', '22', '422 succeed,622 fail,911 no_pass.' ); %stats = ( 'group' => 'group2', 'level' => 'alarm_level_2', 'total' => '22' ); C:\perlp> #### my $start = 'string-here string-here:'; my $level = '\((\w+)\)'; my $group = '([\w\s]+) completed,'; my $total = 'Total (\d+) client\(s\),'; # if there are details, they're captured in the end parens my $re = qr/^$start $level $group $total ?(.*)$/;