in reply to Reference as the only Object element

Try $self= [@_]; [(update2) in place of $self= \\@_;].

Update: I'd say more but I can't figure out what

I wasnīt able to "pass this reference" returned from Parser to the reference member of the Entry object.
means. I was around when
Someone here at the Chatterbox told me, that this indeed isnīt possible
and I'll wager that we didn't understand what was being asked.

Anyway, I wouldn't ever put \@_ into an object as changes to @_ would be reflected in the object and I'm not sure what changes Perl itself might make to @_ when the subroutine exits. Also, the elements of @_ are aliases to the arguments passed in (that is \$_[0] == \$arg0) so changing $_[0] changes the variable (in the caller) that was passed in and vice versa. But [@_] creates a new anonymous array and copies the elements of @_ into it and so shouldn't suffer from these two problems.

But none of that explains to me why \\@_ would work. /:

        - tye (but my friends call me "Tye")

Replies are listed 'Best First'.
Re: (tye)Re: Reference as the only Object element
by PetaMem (Priest) on Nov 02, 2001 at 21:42 UTC
    > Try $self=[@_];

    Where? :-)

    What I mean with "pass this reference" is actually "clone a reference". Again assume you have a parser and this parser is filling you a structure (basically a list). You let your parser return a reference to the structure created and you would like your Entry Object to store THAT Reference.

    This seems not possible. BTW: You throw up an interesting point:

    >Anyway, I wouldn't ever put \@_ into an object as changes...

    How do you declare an object whose only element is a reference to a list (or hash for that matter)?

    Thanks Richard

      You're confusing the implentation of the object and the attributes of that object.

      If you want to declare an object which is implented as a list, I'd do something like:

      sub new { my $class = shift; my $self = [@_]; bless $self, $class; return $self; } sub getList { my $self = shift; if (wantarray) { return @$self; else { return [@$self]; } }

      If you wanted to have a class which had only one attribute and that attribute was a list, I'd do something like:

      sub new { my $class = shift; my $self = {}; bless $self, $class; $self->{LIST} = [@_]; return $self; } sub getList { my $self = shift; if (wantarray) { return @{$self->{LIST}}; else { return [@$self->{LIST}]; } }
      Then, you would add setters as well. However, we already have something like this, in the form of tie and Tie::Array (and its cousin Tie::Hash). Check those out.

      ------
      We are the carpenters and bricklayers of the Information Age.

      Don't go borrowing trouble. For programmers, this means Worry only about what you need to implement.

        After chatting with Fatvamp, I think what he wants is something close to this:

        sub new { return bless [], shift; } sub addItems { my $self= shift; unshift @$self, @_; } sub setList { my $self= shift; my( $ref )= @_; if( 1 == @_ && ref($ref) ) { @$self= @$ref; } else { @$self= @_; } } sub getItem { my $self= shift; my $idx= shift; return $self->[$idx]; } sub getList { my $self= shift; if (wantarray) { return @$self; } else { return [@$self]; } }

                - tye (but my friends call me "Tye")