더 나은이 작업을 수행하고, 대신 같은 구조적인 접근을하지 않도록 MooseX::Runnable.
같은 클래스가 보일 것이다 : 바로 "실행보다 큰 대화 형 스크립트 내부
my $finder = Get::Me::Data->new(database => $dbh);
$finder->get_data('jrockway');
: 당신은 쉽게 프로그램 내에서 사용할 수있는 클래스가 이제
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;
}
}
위의 방법 :
...
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.";
...
이 독립형 작업을 수행하려는 경우 다음을 말할 수 있습니다.
$ 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>
작성한 코드의 양과 결과 클래스의 유연성에 유의하십시오. "main if! caller"는 좋지만 더 잘할 수있을 때 왜 귀찮은가?
(BTW, MX :: Runnable에는 플러그인이 있으므로 표시되는 디버깅 출력을 쉽게 늘릴 수 있으며 코드가 변경되면 앱을 다시 시작하고 앱을 영구적으로 유지 한 다음 프로파일 러에서 실행하는 등)
정말 도움이됩니다. 링크를 가져 주셔서 감사합니다. – seth
@seth 여러분을 환영합니다. –
'perl -MyyClass -e '...''는 어떨까요? –