2010-03-25 8 views
1

일부 인수를 제거하기 위해 수정하려고하는 명령 줄이 있습니다. 이 복잡한 점은 중첩 된 인수를 가질 수 있다는 것입니다.Perl에서 복잡한 명령 행 인자 문자열을 어떻게 수정할 수 있습니까?

$cmdline = "-a -xyz -a- -b -xyz -b- -a -xyz -a-" 

내가 두 개의 서로 다른 맥락에서 해석되어야하는 세 가지 -xyz 플래그를 가지고 :

내가 이것을 가지고 있다고 말한다. 하나는 -a 컨텍스트이고 다른 하나는 -b 컨텍스트입니다.

"a"-xyz '을 (를) 제거하고 싶지만 "b"에있는 것들은 그대로 두십시오. -xyz. 위의 경우에서

, 내가 원하는 : 나는 경우

-a -a- -b -xyz -b- -a -a- 

다른 방법은 :

-a -123 -a- -b -xyz -b- -a -xyz -a-" 

을 내가 원하는 :

-a -123 -a- -a -xyz -a- -b -xyz -b- -a -a- 

그것은 난이 두 번째 사건 붙어있어.

Perl에서 가장 효과적으로 어떻게 할 수 있습니까?

+2

궁금 해요 : 당신이 말도 안되는 강요 무엇? :) –

답변

2
use strict; 
use warnings; 

my @cmds = (
    '-a -123 -a- -b -xyz -b- -a -xyz -a-', 
    '-a -xyz -a- -b -xyz -b- -a -xyz -a-', 
); 

for my $c (@cmds){ 
    # Split command into parts like this: "-a ... -a-" 
    my @parts = $c =~ /(-\w\s .+? -\w-)/gx; 
    for my $p (@parts){ 
     $p =~ s{-xyz\s+}{} if $p =~ /^-a/; 
    } 
    # The edited command line consists of the joined parts. 
    print "@parts\n"; 
} 
0

정확하게 이해하면 컨텍스트는 -a으로 시작하고 -a-으로 끝납니다.

use warnings; use strict; 

my $cmdline = "-a -123 -a- -b -xyz -b- -a -xyz -a-"; 
$cmdline =~ s/(?-a) +-xyz +(-a- ?)/$1 $2/g; 

print "$cmdline\n"; 
+0

나는 그런 것을 시도했다. 문제는이 cmdline입니다 : "-a -123 -a -b -xyz -b- -a -xyz -a-" 이 경우 원하는 : -a -123 -a- -b - xyz -b- -a -a- -a와 -a- 사이의 모든 것을 제거하지 않으려 고합니다. -xyz 만 제거합니다. – mmccoo

1
#!/usr/bin/perl -w 
sub replace_in_ctx { 
    my $cmdline = shift; 
    my @result =(); 
    for (split//, $cmdline) { 
    push @result, $_ unless /-a/../-a-/ and /^-xyz$/; 
    } 
    return join " ", @result; 
} 
# first case 
print replace_in_ctx("-a -xyz -a- -b -xyz -b- -a -xyz -a-") . "\n"; 

# second case 
$_ = replace_in_ctx("-a -123 -a- -b -xyz -b- -a -xyz -a-"); 
s/-a -123 -a-/$& -a -xyz -a-/; 
print "$_\n"; 

실행을 :

$ perl match_context.pl 
-a -a- -b -xyz -b- -a -a- 
-a -123 -a- -a -xyz -a- -b -xyz -b- -a -a- 
관련 문제