--- loncom/xml/run.pm	2004/02/26 22:08:54	1.44
+++ loncom/xml/run.pm	2004/02/26 23:39:04	1.45
@@ -1,6 +1,6 @@
 package Apache::run;
 #
-# $Id: run.pm,v 1.44 2004/02/26 22:08:54 albertel Exp $
+# $Id: run.pm,v 1.45 2004/02/26 23:39:04 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -27,13 +27,28 @@ package Apache::run;
 
 use HTML::Entities;
 
-$Apache::run::EVALUATE_STRING=<<'ENDEVALUATE';  
-  my %_LONCAPA_INTERNAL_oldexpressions=();
-  while (!$_LONCAPA_INTERNAL_oldexpressions{$_}) {
+$Apache::run::EVALUATE_STRING=<<'ENDEVALUATE';
+my %_LONCAPA_INTERNAL_oldexpressions=();
+while (!$_LONCAPA_INTERNAL_oldexpressions{$_}) {
     $_LONCAPA_INTERNAL_oldexpressions{$_}=1;
-    $_ =~s/((?:\$|\&)(?:(?:\#\$|\#)?[A-Za-z][\w]*|\{[A-Za-z][\w]*\}))([\[\{][^\$\&\]\}]+[\]\}])*?(\([^\$\&\)]+\))*?(?=[^\[\{\(]|$)/eval(defined(eval($1.$2))?eval('$1.$2.$3'):'$1.$2.$3')/seg;
+    $_ =~s/  # $1 will be the variable reference or subroutine name
+            ((?:\$|\&) #look for a starting $ or &
+             (?:[\#|\$]* #support $$ or $#$ etc.
+              [A-Za-z][\w]*| # get variable name
+              \{[A-Za-z][\w]*\})) # for ${a}
+             # $2 is 0 or more array dereferences []
+             #             or  hash dereferences {}
+             # the ^$ and ^& is because we do this iteratively
+             #    $a[$c] becomes $a[3] which then evaluates
+             ([\[\{][^\$\&\]\}]+[\]\}])*?
+             # $3 is the list of arguments
+             (\([^\$\&\)]+\))*?
+                # only match the above if there is not { [ ( coming up
+                # Why? (I.e. this fails &a(1)[2]
+                (?=[^\[\{\(]|$)/
+         &__LC_INTERNAL_EVALUATE__($1,$2,$3)/sexg;
     if (scalar(values(%_LONCAPA_INTERNAL_oldexpressions))>10) {last;}
-  }
+}
 ENDEVALUATE
 
 sub evaluate {