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.


Examine what is said, not who speaks.
"Efficiency is intelligent laziness." -David Dunham
"Think for yourself!" - Abigail
Timing (and a little luck) are everything!

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
    I think that the second solution (using a method returning an lvalue) solves two of my three problems. Thank you very much!