in reply to Autovivifying XS routine
You can do this fairly easily using overload:
#! perl -slw use strict; package Gimme; use Scalar::Util qw[ refaddr ]; my %hashes; my %arrays; use overload '%{}' => sub { return $hashes{ refaddr( $_[ 0 ] ) }; }, '@{}' => sub { return $arrays{ refaddr( $_[ 0 ] ) }; }, '""' => sub { return overload::StrVal( $_[ 0 ] ); }, '0+' => sub { return overload::StrVal( $_[ 0 ] ); }, ; sub new { my( $class, $dummy ) = shift; my $self = \$dummy; $hashes{ 0+$self } = {}; $arrays{ 0+$self } = []; return bless $self, $class; } package main; my $gimme = new Gimme; @{ $gimme } = 1 .. 10; print @{ $gimme }; %{ $gimme } = 'A' .. 'Z'; print %{ $gimme }; print $gimme->{ fred } = 'bill'; print $gimme->[ 123 ] = 456; __END__ C:\test>junk9 12345678910 STABOPWXKLYZEFQRMNCDIJGHUV bill 456
And I've seen overloading done using XS, though I've never done it myself, so in theory at least it should be possible to do it without having to chase opcode trees.
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: Autovivifying XS routine
by Anno (Deacon) on Jun 01, 2007 at 15:27 UTC | |
by BrowserUk (Patriarch) on Jun 01, 2007 at 15:49 UTC | |
by Anno (Deacon) on Jun 01, 2007 at 16:07 UTC | |
by BrowserUk (Patriarch) on Jun 01, 2007 at 16:53 UTC | |
by Anno (Deacon) on Jun 01, 2007 at 18:40 UTC |