如何使用APL实现类似于PHP中的
我尝试自己解决并想了一个解决方案,下面是我的解决方法。我也想看看其他可能的解决方法。
explode
和implode
函数?我尝试自己解决并想了一个解决方案,下面是我的解决方法。我也想看看其他可能的解决方法。
explode
和implode
函数?,array,delimeter
一样简单(但您随后必须挑战删除用于填充的空格)。⎕ml←3 ⍝ "migration-level" (only Dyalog APL) to ensure APL2-compatibility
s←' '
A←s,'BIRD',s,'CAT',s,'DOG' ⍝ note that delimeter also used as 1st char!
exploded_string←1↓¨(+\A=s)⊂A ⍝ explode
imploded←∊s,¨exploded_string
A≡imploded ⍝ test for successfull round-trip should return 1
A=s
部分会出现长度错误。但这种技术可以进行适应性调整。这种方法的一个有用之处在于它保留了两个分隔符相邻时的空分区。将A改为A←s,'BIRD',s,s,'CAT',s,'DOG'
,然后尝试0=⍴¨exploded_string
以查看空集合。 - Orbling分割字符串:
假设有以下文本字符串和分隔符字符串:
F←'CAT BIRD DOG'
B←' '
可以通过以下方式来实现explode:
S←⍴,B
P←(⊃~∨/(-S-⍳S)⌽¨S⍴⊂B⍷F)⊂F
P[2] ⍝ returns BIRD
限制:
PHP的explode函数在两个分隔符相邻时返回一个空数组值。上面的代码简单地忽略了这一点,并将两个分隔符视为一个。
上面的代码也没有处理重叠的分隔符。如果使用重复字符作为分隔符,则最有可能出现这种情况。例如:
F←'CATaaaBIRDaaDOG'
B←'aa'
S←⍴,B
P←(⊃~∨/(-S-⍳S)⌽¨S⍴⊂B⍷F)⊂F
P ⍝ returns CAT BIRD DOG
CAT aBIRD DOG
,因为它不认识'aaa'作为紧跟着'a'的分隔符。相反,它将其视为两个重叠的分隔符,最终起到单个分隔符的作用。另一个例子是'tat'作为分隔符,在这种情况下,字符串中出现的任何'tatat'都会有同样的问题。S←⍴,B
A←B⍷F
A←(2×A)>⊃+/(-S-⍳S)⌽¨S⍴⊂A
P←(⊃~∨/(-S-⍳S)⌽¨S⍴⊂A)⊂F
第三行代码会消除在当前位置前距离任何定界符位置小于S-1
个字符的所有字符串。如我所说,这只解决单个重叠的问题。如果有两个或更多的重叠,则第一个被识别为定界符,其余所有的都被忽略。下面是两个重叠的示例:
F←'CATtatatatBIRDtatDOG'
B←'tat'
S←⍴,B
A←B⍷F
A←(2×A)>⊃+/(-S-⍳S)⌽¨S⍴⊂A
P←(⊃~∨/(-S-⍳S)⌽¨S⍴⊂A)⊂F
P ⍝ returns CAT atatBIRD DOG
P←'CAT' 'BIRD' 'DOG'
B←'-'
(⍴,B)↓∊B,¨P
(-S-⍳S)
和旋转⌽
来匹配整个分隔符。我认为这是一种标准技术,但仍然很好看。为了避免重叠,您可能需要使用未使用的字符对分隔符进行标记,然后在两个相邻的分隔符标记之间添加不同的标记来表示空集。 - Orbling使用reduce函数可以实现一个有趣的替代implode的方法:
p←'cat' 'bird' 'dog'
↑{⍺,'-',⍵}/p
cat-bird-dog
f←'CATtatBIRDtatDOG'
b←'tat'
b{(~(-⍴⍵)↑(⍴⍺)∨/⍺⍷⍵)⊂⍵}f
CAT BIRD DOG
P
,而P[3]
的结果是“Ttat”,而不是预期的“DOG”。 - Expedito⍵←f ⋄ ⍺←b
,因此通过交换字母,它可以在任何其他地方运行:(~(-⍴f)↑(⍴b)∨/b⍷f)⊂f
。 - Orbling⍴b
个字符中,则由于take拉入零来补足前面的长度,它会搞乱删除初始分隔符。如果在take之前初始数字为1,则确保集合以⍴b
个前缀为1开始,应该可以解决这个问题。 - Orbling