2010-03-25 2 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

Я пробовал что-то подобное. Проблема заключается в следующем: "-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- 
Смежные вопросы