2012-04-25 11 views
0

私はコマンドラインからパラメータを取得しようとしています。パラメータが正しい場合は、それに基づいて特定の関数を呼び出します。私はperlの新機能です。これを実現する方法を知っている人もいます。perl parseコマンドラインオプション

script.pl aviator #switch is valid and should call subroutine aviator() 
script.pl aviator debug #valid switch and should call subroutine aviator_debug 
script.pl admin debug or script.pl debug admin #valid switch and should call subroutine admin_debug() 
script.pl admin #valid switch and should call subroutine admin() 
script.pl dfsdsd ##invalid switch ,wrong option 

答えて

2

バリアント1:

#!/usr/bin/perl 

my $command=join(' ',@ARGV); 
if ($command eq 'aviator') { &aviator; } 
elsif ($command eq 'aviator debug' or $command eq 'debug aviator') { &aviator_debug; } 
elsif ($command eq 'admin debug' or $command eq 'debug admin') { &admin_debug; } 
elsif ($command eq 'admin') { &admin; } 
else {print "invalid option ".$command."\n";exit;} 

バリアント2:

#!/usr/bin/perl 

if (grep /^aviator$/, @ARGV) { 
    if (grep /^debug$/, @ARGV) { &aviator_debug; } 
    else { &aviator; } 
} elsif (grep /^admin$/, @ARGV) { 
    if (grep /^debug$/, @ARGV) { &admin_debug; } 
    else { &admin; } 
} else { print "invalid option ".join(' ',@ARGV)."\n";exit;} 
exit; 

バリアント3:

#!/usr/bin/perl 
use Switch; 

switch (join ' ',@ARGV) { 
    case 'admin' { &admin();} 
    case 'admin debug' { &admin_debug; } 
    case 'debug admin' { &admin_debug; } 
    case 'aviator' { &aviator; } 
    case 'aviator debug' { &aviator_debug; } 
    case 'debug aviator' { &aviator_debug; } 
    case /.*/ { print "invalid option ".join(' ',@ARGV)."\n";exit; } 
} 
+0

引数間のスペースが不明確になることがあります。 – Rajeev

+0

@ARGVにはスペースがありません。無効な空白が自動的にそこから削除されます – askovpen

+0

adminのデバッグまたはデバッグの管理者は、このケースでどのように処理されるのですか。... – Rajeev

6

普通の言葉を扱っているので(--switchesではなく)、コマンドラインオプションの配列である@ARGVを見てください。単純なif/elsif/etcをそのデータに適用すると、あなたのニーズに合ったものになります。

は、(より複雑な要件については、私はGetopt::Long::Descriptiveモジュールをお勧めしたい。)

0

H EREは、特定の文字列に対するチェックの多くを持つ問題

#!/usr/bin/perl 
use 5.14.0; 

my $arg1 = shift; 
my $arg2 = shift; 

given ($arg1) { 
    when ($arg1 eq 'aviator') {say "aviator"} 
    when ($arg1 eq 'admin' && !$arg2) {say "admin"} 
    when ($arg1 =~ /^admin|debug$/ && $arg2 =~ /^admin|debug$/) {say "admin debug"} 
    default {say "error";} 
} 
4

に私のテイクで、あなたのシステムがますます複雑に成長するなどのメンテナンスの悪夢のためのレシピです。何らかのディスパッチテーブルを実装することを強くお勧めします。

#!/usr/bin/perl 

use strict; 
use warnings; 
use 5.010; 

my %commands = (
    aviator  => \&aviator, 
    aviator_debug => \&aviator_debug, 
    admin   => \&admin, 
    admin_debug => \&admin_debug, 
    debug_admin => \&admin_debug, 
); 

my $command = join '_', @ARGV; 

if (exists $commands{$command}) { 
    $commands{$command}->(); 
} else { 
    die "Illegal options: @ARGV\n"; 
} 

sub aviator { 
    say 'aviator'; 
} 

sub aviator_debug { 
    say 'aviator_debug'; 
} 

sub admin { 
    say 'admin'; 
} 

sub admin_debug { 
    say 'admin debug'; 
} 
関連する問題