[英]How can I modify complex command-line argument strings in 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中最有效地做到這一點?
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";
}
#!/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-
如果我理解正確,則上下文以-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";
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.