Es ist besser, dies nicht zu tun und stattdessen einen strukturierten Ansatz zu wählen wie MooseX::Runnable .
Ihre Klasse wird wie folgt aussehen:
class Get::Me::Data with (MooseX::Runnable, MooseX::Getopt) {
has 'dsn' => (
is => 'ro',
isa => 'Str',
documentation => 'Database to connect to',
);
has 'database' => (
is => 'ro',
traits => ['NoGetopt'],
lazy_build => 1,
);
method _build_database {
Database->connect($self->dsn);
}
method get_data(Str $for_person){
return $database->search({ person => $for_person });
}
method run(Str $for_person?) {
if(!$defined $for_person){
print "Type the person you are looking for: ";
$for_person = <>;
chomp $for_person;
}
my @data = $self->get_data($for_person);
if(!@data){
say "No data found for $for_person";
return 1;
}
for my $data (@data){
say $data->format;
}
return 0;
}
}
Jetzt haben Sie eine Klasse, die Sie problemlos in Ihrem Programm verwenden können:
my $finder = Get::Me::Data->new( database => $dbh );
$finder->get_data('jrockway');
Innerhalb eines interaktiven Skripts, das größer ist als die obige "run"-Methode:
...
my $finder = Get::Me::Data->new( dsn => 'person_database' );
$finder->run('jrockway') and die 'Failure'; # and because "0" is success
say "All done with Get::Me::Data.";
...
Wenn Sie das allein machen wollen, können Sie das sagen:
$ mx-run Get::Me::Data --help
Usage: mx-run ... [arguments]
--dsn Database to connect to
$ mx-run Get::Me::Data --dsn person_database
Type the person you are looking for: jrockway
<data>
$ mx-run Get::Me::Data --dsn person_database jrockway
<data>
Beachten Sie, wie wenig Code Sie geschrieben haben und wie flexibel die resultierende Klasse ist. "main if !caller" ist nett, aber warum sich die Mühe machen, wenn man es besser machen kann?
(MX::Runnable verfügt übrigens über Plugins, mit denen Sie die Anzahl der angezeigten Debugging-Ausgaben erhöhen, Ihre Anwendung neu starten können, wenn sich der Code ändert, die Anwendung persistent machen, sie im Profiler ausführen können usw.)