2017-09-17 57 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