Как я могу изменить сложные аргументы командной строки в Perl? - PullRequest
1 голос
/ 25 марта 2010

У меня есть командная строка, которую я пытаюсь изменить, чтобы удалить некоторые аргументы. Что делает это сложным, так это то, что у меня могут быть вложенные аргументы.

Скажи, что у меня есть это:

$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?

Ответы [ 3 ]

2 голосов
/ 26 марта 2010
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";
}
1 голос
/ 26 марта 2010
#!/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-
0 голосов
/ 25 марта 2010

Если я правильно понимаю, контекст начинается с -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";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...