0

使用 perl,我想打印我可以通过省略主表达式中的一个条件来获得的所有子表达式。

因此,如果这是输入:C1 和 C2 以及 C3 和 C4
这应该是输出(顺序也很重要,我想省略第一个元素,然后是第二个等):

C2 和 C3 和 C4(缺少第一个元素)
C1 和 C3 和 C4(缺少第二个元素)
C1 和 C2 和 C4(缺少第三个元素)
C1 和 C2 和 C3(缺少第四个元素)

请注意,我的表达式仅使用 AND 作为连词。我知道如何将原始表达式拆分为条件:

my @CONDITIONS = split( / and /, $line );

我也知道我可以使用两个嵌套循环和一些 if/else 来正确处理连接位置,但我很确定有一个更优雅的 perl 解决方案。但对于我的生活,我无法靠自己解决。基本上我要问的是是否有办法在join没有第 i 个元素的情况下创建数组。

4

1 回答 1

2

我喜欢你的问题。根据您的预期输出,我的解决方案是:

my $string = "C1 and C2 and C3 and C4";
my @split = split / and /, $string;

for my $counter (0..$#split) {
  print join ' and ', grep { $_ !~ /$split[$counter]/ } @split;
  print "\n";
}

解释:

这里的神奇之处在于grep只有其中greps的条目@split不包含循环当前索引处的部分。例如,我们从 index 开始0

# $counter == 0
# $split[$counter] contains C1
# grep goes through @split and only takes the parts of @split 
# which does not contain C1, because its inside $split[$counter]
# 
# the next loop set $counter to 1 
# $split[$counter] contains C2 now and the 
# grep just grep again only the stuff of @split which does not contain C2
# that way, we just take the parts of @split which are not at the current loop
# position inside @split :)

编辑:

请注意,我的东西不适用于具有重复条目的字符串:

my $string = "C1 and C2 and C3 and C4 and C4";

输出:

C2 and C3 and C4 and C4
C1 and C3 and C4 and C4
C1 and C2 and C4 and C4
C1 and C2 and C3
C1 and C2 and C3
于 2013-08-06T07:39:45.300 回答