2010-03-25 70 views
1

我有一個命令行,我試圖修改以刪除一些參數。是什麼讓這個複雜的是,我可以有嵌套參數。如何在Perl中修改複雜的命令行參數字符串?

說我有這樣的:

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

我有三個不同的-xyz標誌是在兩個不同的上下文來解釋。一個是-a上下文,另一個是-b上下文。

我想刪除「a」-xyz's,但將其保留在「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

我很好奇:是什麼迫使這些廢話你嗎? :) – 2010-03-25 23:29:31

回答

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 -xyz -a」 在這種情況下我想: -a -123 -a- -b - xyz -b- -a -a- 我不想刪除-a和-a-之間的所有內容,只有-xyz – mmccoo 2010-03-25 21:09:27

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- 
相關問題