인수가있는 Perl 스크립트가 있습니다. 내가 단일 값 인수를했을 때, 다음 코드는 충분했다 :정규식을 기반으로 한 Perl 인수 스위치
switch ($ARGV[0]) {
case "--cmd1" {
$action = "cmd1";
}
case "--cmd2" {
$action = "cmd2";
}
지금, 내가 명령, cmd3
가 --cmd3=SOMETHING
같이 매개 변수가있는 경우가 있습니다. SOMETHING
은 다를 수 있으므로 간단한 스위치/케이스가 더 이상 작동하지 않습니다. 기본적으로 명령 자체에서 스위치/대문자를 사용해야합니다. 첫 번째 일치하는 그룹이 명령이고 두 번째가 옵션 equals 인 정규식을 사용할 수 있다고 생각했습니다. 다음은 작동하지 않지만 내가하려고하는 것을 보여줍니다.
$ARGV[0] =~ m/(.*?)(=.*){0,1}/;
my $cmd = $1;
my $equals = $2;
switch ($cmd) {
case "--cmd1" {
$action = "cmd1";
}
case "--cmd2" {
$action = "cmd2";
}
case "--cmd3" {
$action = "cmd3";
print $equals;
}
::::::::::::::::::::::::::::::::::: 편집 ::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::
나는 그것을 알아 냈다. 그러나 나는 upvotes에 대답하고 어떻게해서든지 받아들이는 사람에게 줄 것이다. 나는 모든 것을 재구성한다는 것을 의미하기 때문에 나는 사용할 수 없다. 여기에 해결책이 있습니다.
switch ($ARGV[0]) {
case "--cmd1" {
$action = "cmd1";
}
case "--cmd2" {
$action = "cmd2";
}
case m/--cmd3(=.*)?/ {
$ARGV[0] =~ m/--cmd3(=.*)?/;
$action = "cmd3";
print $1;
}
'Getopt :: *'을 사용하지 않는 이유는 무엇입니까? –
해시 키를 리터럴 명령 이름으로 사용하고 코드 참조를 해시 값으로 사용하여 가능한 명령을 디스패치 테이블에 넣습니다. 그런 다음 패턴 일치 후에 "$ dispatch {$ 1} -> ($ 2)'" – DavidO
Perl의 스위치가 (더 이상 사용되지 않는) 소스 필터 해킹이라고 말할 수 있습니다. given/when, for/when이 아마 더 나을지도 모르지만, 나는 이런 식으로 해시 기반의 디스패치를 사용하는 것을 선호합니다. – DavidO