通过每次省略一个条件来打印逻辑表达式的所有子表达式

时间:2013-08-06 07:28:29

标签: arrays perl join

使用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个元素的数组,有什么方法。

1 个答案:

答案 0 :(得分: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 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

输出:

{{1}}