bug-apl
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Bug-apl] Not a bug, need help coding search&replace on a vector


From: Christian Robert
Subject: Re: [Bug-apl] Not a bug, need help coding search&replace on a vector
Date: Tue, 21 Jun 2016 21:53:35 -0400
User-agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Thunderbird/45.1.1

Hi,

A more general purpose search&replace (some bug fixed), take (2), was "snr".



      )sic
      )erase replace
      ∇z←s replace p;fr;to;P;i;⎕io
⍝ -------------
→(2≤≡s)/ForEach
→(2≤⍴⍴s)/Matrix
→Vector
⍝ -------------
ForEach: z←{⍵ replace p}¨s ◊ →0
Matrix: z←⊃ {⍵ replace p}¨ ⊂[2]s ◊ →0
⍝ -------------
Vector: p←,¨p ◊ z←s←,s ⋄ ⎕io←1
Loop:→((⍴p)<2)/0
(fr to)←2↑p ◊ p←2↓p
P←¯1↓∧/[1](¯1+⍳⍴fr)⌽fr∘.=z,⎕ucs 1
i←0
Sanitize: i←i+1
→(i>(⍴P)-⍴fr)/Substitute
→(0=P[i])/Sanitize
((⊂ i+¯1+⍳⍴fr)⌷P)←(⍴fr)↑1
→Sanitize
Substitute: P←⌽(P/⍳⍴P)
⊣ {z←((¯1+⍵)↑z),to,(¯1+⍵+⍴fr)↓z}¨P
→Loop
∇

It should be vector, matrix and embedded objects "aware" (as long as it is all 
text)

Syntax:

  source replace "this" "by_that" "this" "by_that" [...]  (eg: pairs of "from" and 
"to")

Examples:

      (⎕cr 'replace') replace 'replace' 'snr' 'ForEach' "Each" "Substitute" "Subst" 
"Sanitize" "Sane"
z←s snr p;fr;to;P;i;⎕io
⍝ -------------
→(2≤≡s)/Each
→(2≤⍴⍴s)/Matrix
→Vector
⍝ -------------
Each: z←{⍵ snr p}¨s ◊ →0
Matrix: z←⊃ {⍵ snr p}¨ ⊂[2]s ◊ →0
⍝ -------------
Vector: p←,¨p ◊ z←s←,s ⋄ ⎕io←1
Loop:→((⍴p)<2)/0
(fr to)←2↑p ◊ p←2↓p
P←¯1↓∧/[1](¯1+⍳⍴fr)⌽fr∘.=z,⎕ucs 1
i←0
Sane: i←i+1
→(i>(⍴P)-⍴fr)/Subst
→(0=P[i])/Sane
((⊂ i+¯1+⍳⍴fr)⌷P)←(⍴fr)↑1
→Sane
Subst: P←⌽(P/⍳⍴P)
⊣ {z←((¯1+⍵)↑z),to,(¯1+⍵+⍴fr)↓z}¨P
→Loop


You can even try "⎕fx" the result if it looks like Ok. (ps: always check the 
result before committing)

Substitutions are done in pair sequence for each /vector/matrix/embedded obj.

So replace order is *very* important.

It must still have some bugs, report them to me, with examples if so. Will do 
my best but no promises.

Purpose: well, not sure, it was an exercise. I used it on itself to finally 
rename the function and change some variables/labels names.


Features: would be fun to pass parameters to each of the /from/to/ like maximum 
number of substitutions to do per line ...
          whole words only (taking apl characters as blanks) ... so variable "s" won't 
match last character of variable "pairs"
          ... no limits


Xtian.


On 2016-06-21 12:27, Juergen Sauermann wrote:
Hi Xtian,

how about this:

*      
**s←"444This4is4a4444test44with44444lot4of4blanks4444at4beginning4and444end444444"**
      from←"444"**
**      to←"5"**
**
**      ↑⍎')HOST echo "',s,'" | sed s/',from,'/',to,'/g'**
**5This4is4a54test44with544lot4of4blanks54at4beginning4and5end55**
**  **
*I have replaced the *^* in your example because it (and some other characters) 
have a special meaning in
regular expressions. But the special characters can be easily quoted in APL if 
needed, for example:

*      
s←"^^^This^is^a^^^^test^^with^^^^^lot^of^blanks^^^^at^beginning^and^^^end^^^^^^"
 **
**      ((s='^')/s)←⊂'\^'**
**      ⊃,/s**
**\^\^\^This\^is\^a\^\^\^\^test\^\^with\^\^\^\^\^lot\^of\^blanks\^\^\^\^at\^beginning\^and\^\^\^end\^\^\^\^\^\^**
*
/// Jürgen


On 06/21/2016 05:12 AM, Christian Robert wrote:
Hi, it's not a bug but a request for help,


suppose 
s="^^^This^is^a^^^^test^^with^^^^^lot^of^blanks^^^^at^beginning^and^^^end^^^^^^"
suppose from="^^^"
suppose to="^"

I need a function who can replace ("^^^" to "^"), or ("^" to "^^^^^^^^") or ("" to 
"blabla" with limits of source size)  ie: without being lost in infinite loop.



"s" is a character vector, "from" is a character vector, and "to" is a 
character vector,
both "s", "from" and "to" can be "".



I'm pretty sure this idiom already exist.

if you can help me, please do.

Xtian.








reply via email to

[Prev in Thread] Current Thread [Next in Thread]