2011-08-03 5 views
2

실행할 때 명령 줄 인수를 받아들이는 스크립트/응용 프로그램을 만들려고합니다. 물론, 이것은 일상적인 일이지만, 내가 이것을하는 것이 처음이므로, 어떤 지침을 찾고 있습니다. 의 내 스크립트 명령 행 인수 이러한 종류의 걸릴 수 있다고 가정 해 봅시다 : 때문에 명령 줄 스크립트의 유연한 특성으로Perl 스크립트에서 명령 줄 인수를 처리하는 올바른 방법은 무엇입니까?

script -a -p /path/to/pipe -l mail.Error -m [email protected] 
script -a -l mail.Error -m [email protected] -p /path/to/pipe 

and so on.... 

을 인수 당신이 /가 주문의 다양한 일부가 누락 될 수 있습니다 그것을 전달할 수 있습니다 잘못된 인수. 이제는 인수가 어떻게 나타나야하는지에 대해 매우 엄격하게 해결할 수 있습니다 (먼저 -a, 경로가있는 -p, 로그 기능/우선 순위가있는 -l, 마지막으로 유효한 전자 메일이있는 -m) 가능한 모든 테스트를 통해 해결할 수 있습니다. 그것들의 발생.

그러나 더 좋은 방법이 있어야합니다. 이것은 매우 비효율적이며 (나에게) 나는 일을하는 더 좋은 방법이 있는지 궁금해하고있었습니다. 가능한 한 유연하게 유지하고 엄격한 사용법에 초점을 두지 않고 작동 시키려고합니다.

답변

6

나는 인수로 Getopt::Long을 사용합니다.

테스트되지 않은 예 :

use Getopt::Long; 
## set defaults 
my $path = '/tmp'; 
my $log = 'm.Error'; 
my $email = '[email protected]'; 
my $a = 0; 
my $result = GetOptions ("path=s" => \$path, 
         "log=s" => \$log, 
         "a"  => \$a, 
         "email=s" => \$email); 
## both script -a -p /path/to/pipe -l mail.Error -m [email protected] 
## and script -a -l mail.Error -m [email protected] -p /path/to/pipe 
## should work now 
+0

또한 'GetOptions'에 해시 참조를 전달할 수 있으며 모든 정보를 해시에 저장합니다. 예를 들어'GetOptions (\ % opt, "path = s", "log = s")가 주어지면'-path/tmp'는'$ opt {path} == "/ tmp"'를 제공 할 것입니다. 코드에서 쉽게 볼 수있는 명령 행 옵션의 정보를 갖는 것이 편리하다는 것을 알았습니다. –

2

사용 Getopt::Std 만 1 문자 옵션, 당신은 더 이상 인수 이름을 지원하려는 경우 Getopt::Long를 원하는 경우.

+2

'Getopt :: Long'을 항상 사용하십시오 - 둘 다 처리 할 수 ​​있습니다. – tchrist

+0

그렇습니다.하지만'Getopt :: Std'는 번들링을 좀 더 간단하게합니다. 예를 들어'-abc'를'-a -b -c'로 처리하는 것입니다 (긴 옵션을 넘겨주지 않는 대신에). 개인적으로, 나는 번들링을 사용하지 않으며, 나는'Getopt :: Std'를 몇 년 동안 사용하지 않았다. 자세한 내용은'perldoc Getopt :: Long'을 읽고 "Bundling"섹션을 읽는다. (몇 가지 설정 옵션이있다.) –

0

Getopt::Long은 해시 변수로 명령 줄을 자동으로 구문 분석 할 수 있습니다. 명령 행의 순서는 중요하지 않습니다. 해시 키를 확인하여 옵션이 제공되는지 여부를 확인할 수 있습니다.

use warnings; 
use strict; 
use Getopt::Long; 

my %opts; 
GetOptions(\%opts, qw(a p=s l=s m=s)) or die; 
관련 문제