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