If this is part of a bigger question and you think some extra effort is worthwhile, then using closures is one way.
use strict; use warnings; sub stringmaker { my( $start, $stringref ) = @_; return sub { $start.$$stringref } } my $r = 300; my $g = stringmaker( 'g', \$r ); print $g->()."\n"; #would be 'g300', that's ok $r = 500; print $g->()."\n"; #would be 'g500'
The disadvantage now is that $g is not a string, but a code reference, and that you need a different stringmaker-routine for different types of strings. The latter can be mitigated somewhat by using sprintf and a template:
use strict; use warnings; sub stringmaker { my( $template, @vals ) = @_; return sub { sprintf $template, map { $$_ } @vals } } my $r = 300; my $i = 0; my $g = stringmaker( '%s: g%s', \$i, \$r ); print $g->()."\n"; # '0: g300' $r = 500; $i = 10; print $g->()."\n"; # '10: g500'
In reply to Re: if $a = 'some' . $b, and $b then changes, how to make $a change too? See inside.
by hdb
in thread if $a = 'some' . $b, and $b then changes, how to make $a change too? See inside.
by Doctrin
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |