Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation
 
PerlMonks  

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

by rvosa (Curate)
on Jul 19, 2006 at 06:42 UTC ( #562200=note: print w/replies, xml ) Need Help??


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

I'm afraid I still don't quite understand the relationship between \@arr in the constructor and the [] array ref in TIEARRAY. Would you mind rewriting this example in a way that demonstrates the "two-faced" aspect of what I'm trying to achieve? There is something like it in perltie, but it doesn't actually have an additional 'new' constructor to abstract away the tie'ing (and uses a hash) and I couldn't quite rework it in the way I intend.

Thanks so much!

Replies are listed 'Best First'.
Re^3: tie'ing a scalar as an array?
by ruoso (Curate) on Jul 19, 2006 at 10:27 UTC

    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
      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
Node Status?
node history
Node Type: note [id://562200]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others imbibing at the Monastery: (7)
As of 2021-01-21 18:37 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    Notices?