use 5.010 ; use strict ; use warnings ; use Data::Dump qw( dump ) ; my @data = @{ _get_data() } ; my @clean_data ; my @removed_data ; foreach my $data_elem ( @data ) { # "Subject: 4 Details - MICHAEL4 NICHOLSON4 - **Senior S4* (4)", if( $data_elem =~ /^(.*?):(.*?)-(.*?)-.*?\*\*(.*?)\*.*?\((.*?)\)$/ ) { my $subject = $1 ; my $item = $2 ; my $name = $3 ; my $position = $4 ; my $id = $5 ; unless( $subject eq 'Subject' ) { warn( "Subject not 'Subject', Ignoring ... \n" ) ; next ; } push @clean_data, [ $subject, $item, $name, $id ] ; push @removed_data, $position ; } else { warn( "Unknown data format - Ignoring\n" ) ; } } dump( \@data ) ; dump( \@clean_data ) ; dump( \@removed_data ) ; exit() ; sub _get_data { my @data ; foreach my $data_item ( 0 .. 10 ) { if( rand() < .5 ) { push @data, "Subject: $data_item Details - MICHAEL$data_item NICHOLSON$data_item - **Senior S$data_item* ($data_item)" ; } else { push @data, "NoSub: $data_item Details - MICHAEL$data_item NICHOLSON$data_item - **Senior S$data_item* ($data_item)" ; } } return \@data ; }