FERREIRA William (COFRAMI) wrote:
my function is very long but i found an example with the same comportment :
CREATE OR REPLACE FUNCTION adoc.totoTest()
  RETURNS int4 AS
$BODY$
 my $var = '->>>';
 &concat($var);

 sub concat {
  $var .= 'tagada';
 }
 elog NOTICE, $var;
 return 4;

$BODY$
LANGUAGE 'plperl' VOLATILE;
first execution : ->>>tagada
second execution : ->>>

In the example above $var in sub concat is NOT an argument provided to the function. What you've done there is create a named closure (if I'm getting my terms right) in which the inner $var is allocated on first call but not afterwards. The second time you run totoTest() the outer $var (my $var) is a new variable, whereas the inner one still refers to the original.


If you actually want to return a concatenated string you'd want something like:

sub concat {
 my $var = shift;
 return $var . 'tagada';
}

If you want to affect an outer variable you'll want something like

sub concat {
  my $var_ref = shift;
  $$var_ref .= 'tagada';
}

Does that help?
--
  Richard Huxton
  Archonet Ltd

---------------------------(end of broadcast)---------------------------
TIP 3: if posting/reading through Usenet, please send an appropriate
     subscribe-nomail command to [EMAIL PROTECTED] so that your
     message can get through to the mailing list cleanly

Reply via email to