sub make_sub { my ( $sub_name, $code ) = @_ ; local $@; eval "sub $sub_name { $code }" ; die "make_sub $sub_name: $@\n" if $@; } make_sub( say_hello => 'print "Hello @_\n"' ); say_hello( 'World' ); __END__ Hello World #### package MyFunctions; # save this as MyFunctions.pm sub say_hello { shift ; # discard class name: perldoc perlboot print "Hello @_\n" } sub list_dir { shift ; # discard class name require Cwd; my $owd = Cwd::cwd(); my $dir = shift; chdir $dir or die "chdir $dir: $!\n"; print $_ . "\n" while <*> ; chdir $owd; } 1; #### #!/usr/bin/perl # save this as program.pl use strict; use warnings; use MyFunctions; print "action> " ; chomp( my $action = ); print "args> "; chomp( my $arg = ); MyFunctions->$action( $arg ); #### $ perl program.pl action> list_dir args> /tmp foo bar baz