#!/usr/bin/env perl -l use strict; use warnings; my @data = ('X_12_yzAAA', 'X_34_yzBBB', 'X_56_yzCCC', 'X_78_yzAAA',); my $re = qr{^.+_(\d+)_.+([A-C]{3})$}; my %despatch = ( AAA => sub { print 'found1 with digits: ', shift }, BBB => sub { print 'found2 with digits: ', shift }, CCC => sub { print 'found3 with digits: ', shift }, ); /$re/ && $despatch{$2}->($1) for @data;