Beefy Boxes and Bandwidth Generously Provided by pair Networks
Think about Loose Coupling
 
PerlMonks  

Re^3: tie'ing a scalar as an array?

by ruoso (Curate)
on Jul 19, 2006 at 10:27 UTC ( [id://562251]=note: print w/replies, xml ) Need Help??


in reply to Re^2: tie'ing a scalar as an array?
in thread tie'ing a scalar as an array?

Ok, Here goes a more complex example, wich shows it in more details:

use strict; use warnings; package Foo::Bar; sub new { tie my @arr, 'Foo::Bar'; return bless \@arr, 'Foo::Bar'; } sub TIEARRAY { my $scalar = "A Scalar"; return bless \$scalar, 'Foo::Bar'; } sub FETCH { my ($self, $index) = @_; print 'FETCH '; if ($index == 0) { return $self->lalala0; } elsif ($index == 1) { return $self->lalala1; } else { return undef; } } sub STORE { my ($self, $index, $value) = @_; print 'STORE '; if ($index == 0) { return $self->lalala0($value); } elsif ($index == 1) { return $self->lalala1($value); } else { return undef; } } sub lalala { my $self = shift; if (UNIVERSAL::isa($self,'ARRAY')) { $self = tied(@{$self}) }; print "Lalala $self\n"; } sub lalala0 { my $self = shift; if (UNIVERSAL::isa($self,'ARRAY')) { $self = tied(@{$self}) }; print "Lalala0 $self\n"; } sub lalala1 { my $self = shift; if (UNIVERSAL::isa($self,'ARRAY')) { $self = tied(@{$self}) }; print "Lalala1 $self\n"; } sub DESTROY { my $self = shift; if (UNIVERSAL::isa($self,'ARRAY')) { print "Destroying the array...\n"; } else { print "Destroying the scalar...\n"; } } package main; my $a = Foo::Bar->new(); # The object inside is a SCALAR $a->lalala(); $a->[0] = $a->[1]; $a->[1] = $a->[0];

UPDATE: Included the DESTROY method, to illustrate...

daniel

Replies are listed 'Best First'.
Re^4: tie'ing a scalar as an array?
by rvosa (Curate) on Jul 20, 2006 at 08:32 UTC
    Thanks, that's cool!

    Do I understand correctly that the lowercase methods can either be invoked on the scalar or the array (as both are blessed into the package), and therefore you sometimes have to retrieve the tied scalar from the array (if that happens to be the invocant)?

    So, if you use, say, a $a->[0] construct, the STORE method is called on the array reference. STORE then invokes $a->lalala0 on the array, so the lalalao sub needs to retrieve the tied scalar from the invocant array.

    Is that sort of how it works?

      Exactly.

      daniel

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://562251]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others surveying the Monastery: (5)
As of 2024-03-28 16:10 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found