Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何在Perl中修改复杂的命令行参数字符串?_Regex_Perl - Fatal编程技术网

Regex 如何在Perl中修改复杂的命令行参数字符串?

Regex 如何在Perl中修改复杂的命令行参数字符串?,regex,perl,Regex,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-

我有一个命令行,我正试图修改它以删除一些参数。使这个问题变得复杂的是我可以有嵌套的参数

说我有这个:

$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中如何才能最有效地做到这一点?

如果我理解正确,上下文以
-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";
运行它:

$ perl match_context.pl 
-a  -a- -b -xyz -b- -a  -a-
-a -123 -a- -a -xyz -a- -b -xyz -b- -a  -a-

我试过类似的东西。问题是这个cmdline:“-a-123-a--b-xyz-b--a-xyz-a-”在这种情况下,我想要:-a-123-a--b-xyz-b--a-a-我不想删除-a和-a-之间的所有内容,只有-xyzI-我很好奇:是什么把这些废话强加给了你?:)
$ perl match_context.pl 
-a  -a- -b -xyz -b- -a  -a-
-a -123 -a- -a -xyz -a- -b -xyz -b- -a  -a-
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";
}