use List::Util qw( first ); my @disp = ( { pattern => qr{\A Job: }xms, action => sub { $job_details_info{Job} = shift }, }, { pattern => qr{\A File: }xms, action => sub { push @files, shift }, }, { pattern => qr{\A Image }xms, action => sub { $job_details_info{Image} = shift }, } ); my $todo = first { $line =~ $_->{pattern} } @disp; if ( defined $todo ) { $todo->{action}->( $line ); } else { warn "no match: $line"; }