#!/usr/bin/env perl
use strict;
use warnings;
# Script variables
our $Foo = 'bar';
# Main routine
my ($name, $greeted) = @ARGV;
$name //= 'Horace!';
$greeted //= 'world';
say_hello($greeted);
# Subroutines
sub say_hello {
my ($name) = @_;
print "Hello $name\n";
}
####
# Main routine
sub main {
my ($name, $greeted) = @ARGV;
$name //= 'Horace!';
$greeted //= 'world';
say_hello($greeted);
}
main();
##
##
# Main routine
MAIN: {
my ($name, $greeted) = @ARGV;
$name //= 'Horace!';
$greeted //= 'world';
say_hello($greeted);
}
##
##
# Main routine
MAIN: {
my ($name, $greeted) = @ARGV;
$name //= 'Horace!';
$greeted //= 'world';
say_hello($greeted);
exit(0);
}
##
##
package My::Routine;
# ...
# Main routine
sub main {
my ($name, $greeted) = @ARGV;
$name //= 'Horace!';
$greeted //= 'world';
say_hello($greeted);
}
# Run the main routine only when called as a script
__PACKAGE__->main() unless caller;
##
##
#!/usr/bin/perl
use Devel::Main 'main';
# ...
# Main routine
main {
my ($name, $greeted) = @ARGV;
$greeted //= 'world';
say_hello($greeted);
};
##
##
#!/usr/bin/env perl
require 'script_with_main.pl';
print "Loaded script!\n";
run_main('Shakespeare!', 'perlmonks');
##
##
$ perl test_test_main.pl
Loaded script!
Hello perlmonks
##
##
use strict;
use warnings;
# Devel::Main by stephen
package Devel::Main {
# We use Sub::Exporter so you can import main with different names
# with 'use Devel::Main 'main' => { -as => 'other' }
use Sub::Exporter;
Sub::Exporter::setup_exporter({ exports => [ qw/main/ ]});
# Later versions will let you customize this
our $Main_Sub_Name = 'run_main';
sub main (&) {
my ($main_sub) = @_;
# If we're called from a script, run main and exit
if ( !defined caller(1) ) {
$main_sub->();
exit(0);
}
# Otherwise, create a sub that turns its arguments into @ARGV
else {
no strict 'refs';
my $package = caller;
*{"${package}::$Main_Sub_Name"} = sub {
local @ARGV = @_;
return $main_sub->();
};
# Return 1 to make the script pass 'require'
return 1;
}
}
};
1;