代码之家  ›  专栏  ›  技术社区  ›  lisprogtor

perl6置换匹配

  •  1
  • lisprogtor  · 技术社区  · 7 年前

    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 回复  |  直到 7 年前
        1
  •  3
  •   raiph    7 年前

    新答案

    根据大家的意见,我重申了我现在理解的问题,然后提出了一个新的解决方案:

    测试一下 Y ,一个字符串,包含中的所有字符串 Z Bag multiset )具有正确的副本计数/多重性。

    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
    

    这一行代码的解释见本答案的最后一部分。


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

    'xxx' $y 但两个数组中都没有。所以这一点是不匹配的。有一个 'foo' @z . 应该是这样吗 “xxx” 'one' 在你的 $y 但两个阵列至少都有

    我觉得你的叙述也令人困惑。

    有一个 xxx 最后,关键意见是:


    这么说吧。所有等式@z.any
    

    so True False )右边的表达式。

    上的表达式 Junctions . 它的英文散文摘要是“所有的”字 $y ,一次取一个,字符串至少等于 @z

    这就是你想要的简单解决方案吗?