in reply to if $a = 'some' . $b, and $b then changes, how to make $a change too? See inside.
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'
|
|---|