Tốt hơn để không làm điều này, và thay vào đó lấy một cách tiếp cận có cấu trúc như MooseX::Runnable.
lớp của bạn sẽ trông giống như:
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;
}
}
Bây giờ bạn có một lớp có thể được sử dụng bên trong chương trình của bạn một cách dễ dàng:
my $finder = Get::Me::Data->new(database => $dbh);
$finder->get_data('jrockway');
Bên trong một kịch bản tương tác lớn hơn chỉ là "chạy "phương pháp trên:
...
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.";
...
Nếu bạn chỉ muốn thực hiện việc này độc lập, bạn có thể nói:
$ 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>
Lưu ý bạn viết mã nhỏ như thế nào và lớp linh hoạt như thế nào. "chính nếu! người gọi" là tốt đẹp, nhưng tại sao bận tâm khi bạn có thể làm tốt hơn?
(BTW, MX :: Runnable có plugin; vì vậy bạn có thể dễ dàng tăng số lượng đầu ra gỡ lỗi bạn thấy, khởi động lại ứng dụng của bạn khi mã thay đổi, làm cho ứng dụng liên tục, chạy trong hồ sơ, v.v.)
Điều này thực sự hữu ích. Cảm ơn các liên kết. – seth
@seth bạn được chào đón. –
Điều gì về 'perl -MMyClass -e '...''? –