Besser dies nicht zu tun, und stattdessen einen strukturierten Ansatz 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([email protected]){
say "No data found for $for_person";
return 1;
}
for my $data (@data){
say $data->format;
}
return 0;
}
}
Jetzt haben Sie eine Klasse, die leicht in Ihrem Programm verwendet werden können:
my $finder = Get::Me::Data->new(database => $dbh);
$finder->get_data('jrockway');
Innerhalb eines interaktiven Skript, das größer als nur die „run ist "Methode oben:
...
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 nur dieses Standalone tun möchten, können Sie sagen:
Beachten Sie, wie wenig Code Sie geschrieben haben, und wie flexibel die resultierende Klasse ist. "main if! caller" ist nett, aber warum sollte man sich bemühen, wenn man es besser kann?
(BTW, MX :: Runnable hat Plugins; so können Sie einfach die Menge der Debugging-Ausgabe erhöhen, starten Sie Ihre App, wenn der Code ändert, machen Sie die App persistent, führen Sie es im Profiler, etc.)
Das ist wirklich hilfreich. Danke für den Link. – seth
@seth Sie sind willkommen. –
Was ist mit 'perl -MMyClass -e '...''? –