2017-09-17 59 views
1

我仍然试图在排列匹配上工作,我不知道是否有人有更好的方法来做到这一点。我想以任何顺序匹配数组中的所有模式,即匹配数组中的项(字符串或其他对象)的排列。例如,如果数组是(1,2,3),那么如果一个字符串以任意顺序包含1和2以及3,则为真;即如果一个字符串包含(1,2,3)的排列,则为真。perl6排列匹配

我现在是这样的:

my @x = < one eins uno yi two zwei dos er one one one two two two >; 
my @z = < one eins uno yi two zwei dos er one one one two two two foo >; 
my $y = "xxx one eins uno yi two zwei dos er xxx"; 

sub matchAllWords($aString, @anArray) { 
    my $arraySize = @anArray.elems; 
    if $arraySize == 0 { False; } 
    elsif $arraySize == 1 { 
    ($aString.match(/:i "@anArray[0]" /)).Bool; 
    } else { 
    my $firstCheck = ($aString.match(/:i "@anArray[0]"/)).Bool; 
    if $firstCheck { 
     $firstCheck 
     and 
     (matchAllWords($aString, @anArray[1..*])); 
    } else { 
     return False; 
    } 
    } 
} 

say matchAllWords($y, @x); 
# result is True, but it should NOT be True because $y should not 
# match permutations of @x which contains multiple identical elements 
# of "one" and "two" 
say matchAllWords($y, @z); # False as expected; 

的问题是,我的所有功能独特的单词相匹配的阵中,但无法区分的重复的单词排列。我可以添加越来越多的代码来判断一个单词是否已经匹配,但是更多的代码来完成一个简单的想法,即“排列匹配”,是不可逾越的。有什么建议么?由于

+1

我不清楚你想达到什么目的。你是否想要检查Array'n'次中包含的每个元素是否也出现在字符串中,正好是'n'次?或者是其他东西? – smls

+1

你看了,'袋'和设置操作员?感觉就像你想以某种方式比较两个包(身份/子集)。那是你要的吗? –

+0

难道你只是排序两个列表? –

回答

3

根据大家的意见新的答案

,这里是我现在的理解问题的重述,然后​​提出新的解决方案:

测试是Y,一个字符串,包含所有的字符串ZBagmultiset),具有正确的拷贝数/多重性。

my \Z = < one eins uno yi two zwei dos er two > .Bag ; 

my \Y = "xxx one eins uno yi two zwei dos er two xxx" ; 

sub string-matches-bag ($string, $bag) { 
    for $bag.kv -> $sub-string, $copy-count { 
     fail unless ($string ~~ m:g/ $sub-string /).elems == $copy-count 
    } 
    True 
} 

say string-matches-bag Y, Z 

老答案

say so $y.words.all eq @z.any 

这行代码的解释是这个答案的最后一部分。


我发现你的问题很混乱。但我希望这个答案要么是你想要的,要么至少足以把事情朝着正确的方向发展。

我发现你的数据很混乱。在$y中有两个'xxx'单词,但两个都没有。所以这一点不能匹配。您的@z中有'foo'。那应该是'xxx'?您的$y中有一个'one',但两个阵列至少有两个 'one' s。这是一个问题吗?

我发现你的叙述也很混乱。

对于这个答案,我认为@zxxx末,而关键的评论是:

一个简单的想法, “排列匹配”


say so $y.words.all eq @z.any 

so返回右边表达式的布尔值(TrueFalse)。

so正确的用法是Junctions。英文散文摘要是“$y”中的所有“单词”,每次一个,字符串等于至少一个元素@z'。

这是您要求的简单解决方案吗?

+0

谢谢你raiph!抱歉让人困惑。让我重新说一句我的问题:这个字符串是否匹配任何一个单词数组的排列?例如,如果字符串是“1a2”,而数组是<1,1,a,2>,那么它将不匹配,因为数组的所有排列都有两个“1”。字符串“x1y2zab1”应该匹配,因为它包含数组的排列。我正在考虑这样的问题:说出这么$ y ~~ m/<{EVAL @ a.permutations.one}> /但这还没有起作用,我个人不喜欢EVAL,因为使用EVAL意味着我缺乏表达能力和我的代码清晰。谢谢 !!! – lisprogtor

+0

我希望perl6可以将这种排列匹配添加到其基本匹配实用程序。我必须解决的真实世界应用是这样的。文件的每一行都有一些重要的单词,任何顺序都可以,也可以不用空格隔开,我只知道一些单词的一部分,而我想要包含这些单词部分的行。谢谢 ! – lisprogtor

+0

太棒了!非常感谢你raiph! Bag,:与元素数量的匹配是一个整洁的想法。我很高兴生活在一个大多数人比我更聪明,更有知识的世界里:-) – lisprogtor