#!/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/]);