use strict; use warnings; my @CMDS = ( { regex => qr/^cp\s+(\S+)\s+(\S+)/, code => \&do_cp }, { regex => qr/^mv\s+(\S+)\s+(\S+)/, code => \&do_mv }, ); my $input_string = ; foreach my $cmd ( @CMDS ){ my @match = ($input_string =~ /$cmd->{regex}/) or next; $cmd->{code}( @match ); } sub do_cp { my $src = shift; my $dest = shift; warn "cp $src $dest"; } sub do_mv { my $src = shift; my $dest = shift; warn "mv $src $dest"; }