|
oldguy2 Wizard
Joined: 17 Jun 2006 Posts: 1201
|
Posted: Fri Dec 03, 2010 10:54 pm
[3.32] #call %replace |
Please see this thread to explain.
Zugg stated to use the following to optimize:
Code: |
#call %replace(%ref($dirList), %i, "sw") |
I tried the following which did not work:
Code: |
$list = {A|B|C|D|E|F|G}
#call %replace(%ref($list), "A", "one")
#call %replace(%ref($list), "B", "two")
#call %replace(%ref($list), "C", "three")
#print $list |
It printed A|B|C|D|E|F|G.
The following DOES work:
Code: |
$list = {A|B|C|D|E|F|G}
$list = %replace(%ref($list), "A", "one")
$list = %replace(%ref($list), "B", "two")
$list = %replace(%ref($list), "C", "three")
#print $list |
|
|
|
|
shalimar GURU
Joined: 04 Aug 2002 Posts: 4715 Location: Pensacola, FL, USA
|
Posted: Fri Dec 03, 2010 11:42 pm |
%replace doesn't change the variable string, it just shows what it would look like.
your working method of defining a variable with the %replace function is the intended method to save the results. |
|
_________________ Discord: Shalimarwildcat |
|
|
|
charneus Wizard
Joined: 19 Jun 2005 Posts: 1876 Location: California
|
Posted: Sat Dec 04, 2010 12:31 am |
shalimar: That's why he said to reference the linked post above. Zugg specifically stated you can do that:
Zugg wrote: |
Btw, regarding optimizing your script, don't forget the new %ref function that allows you to modify a list "in place". Instead of doing:
Code: |
$dirList = %replace($dirList, %i, "sw") |
you can do this:
Code: |
#call %replace(%ref($dirList), %i, "sw") |
This is like using the name of a list instead of @list but works with local variables where there is no way to name it without the $ character. I think CMUD does already optimize your original code when it detects that you are assigning to the same variable that was modified, so it might not actually make things any faster, but it's better practice to be aware of when you can use "by reference" to help speed things up in the future.
Also, it would speed up your script to only access %item($ret,%i) once and put that into another local variable, then use the local variable in your #IF testing. |
|
|
|
|
shalimar GURU
Joined: 04 Aug 2002 Posts: 4715 Location: Pensacola, FL, USA
|
Posted: Sun Dec 05, 2010 8:37 pm |
Ahhh I see it now... but according to the Knowledge Base, I really don't see how %ref is helping in this situation.
You are not referencing one variable via another.
Even if you were %replace still doesn't perform a direct change on the variable, its cosmetic only.
No offense to Zugg, but I think there is an error of logic. How does this retain the new value without assigning it? |
|
_________________ Discord: Shalimarwildcat |
|
|
|
oldguy2 Wizard
Joined: 17 Jun 2006 Posts: 1201
|
Posted: Sun Dec 05, 2010 11:02 pm |
Well I would assume like any other language you are passing by reference to the %replace function and not by value. I am not sure where you get cosmetic. Granted, that in this case, passing by value wouldn't matter since the list is tiny. However, it was just a test and this list could contain a thousand items for example. The fact remains that it isn't working as stated.
|
|
|
|
shalimar GURU
Joined: 04 Aug 2002 Posts: 4715 Location: Pensacola, FL, USA
|
Posted: Mon Dec 06, 2010 9:19 am |
By cosmetic i mean that %replace is a temporary unsaved change.
|
|
_________________ Discord: Shalimarwildcat |
|
|
|
Rahab Wizard
Joined: 22 Mar 2007 Posts: 2320
|
Posted: Mon Dec 06, 2010 1:53 pm |
Shalimar, one of the big changes late in 3.xx development was allowing certain %functions (%additem, %delitem, %addkey are among the ones specifically mentioned in the version history) to affect the variable parameter directly if they use a variable by reference (varname instead of @varname). %ref() was created specifically to allow local variables to modified in the same way. %replace() is not one of the functions specifically mentioned in the version history, but Zugg is implying that it, too, is supposed to have this functionality.
|
|
|
|
Zugg MASTER
Joined: 25 Sep 2000 Posts: 23379 Location: Colorado, USA
|
Posted: Mon Dec 06, 2010 5:30 pm |
Rahab is correct. Only certain functions can modify a list "in place".
The %replace function works on *string* values and not on lists. Each time you call %replace, CMUD is converting the $list into a string value, and then performing the string substitution, and then returning the new string value (which you either ignore with #CALL or assign back to $list, which causes the string value to be converted back into a string list)
Using %replace like this is slow and will not work properly on nested values. You should be using the %replaceitem to replace items within a list.
OldGuy: Sorry I made the mistake in my original post and did not read your script correctly. When I saw %replace I was thinking about %replaceitem. |
|
|
|
|
|