in reply to How to swap scalar values without copies
This is possible in pure perl, if you can live with using a global var?
$buffer = 'x' x 10000000; # memory used 12,200kb *x = \$buffer; # mem used 12.200kb print length $x; 10000000 print substr $x, 0, 30; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
$x is now an alias for the buffer and can be used as any scalar can be. However, I don't think that there is any way to use a glob assignment with a hash element.
A possible alternative would be to wrap an lvalue sub (or method) around the $buffer.
sub test : lvalue { $buffer }; print length test; 10000000 print substr test, 0, 10; xxxxxxxxxx substr( test, 3, 3 ) = 'ABC'; print substr test, 0, 10; xxxABCxxxx print length test; 10000000
This behaves like a scalar for most purposes albeit that the syntax looks a little strange. As a method, the syntax would be
print substr obj->test, 20_000, 5; substr( obj->test, 20_000, 5 ) = 'hello';
which isn't too aweful. It would mean utilising a global with the risk of being stomped on elsewhere, but using a suitably obscure name should minimise the risk of that.
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: Re: How to swap scalar values without copies
by Anonymous Monk on Feb 20, 2004 at 18:29 UTC |