Ed am Dienstag, 11. April 2006 21.50:
>  Though I'm making progress (thanks guys) I'm still having a problem
> with dereferencing the struct elements. I've re-read the section on
> References in Programming Perl and I thought what I was doing was
> correct, but I can't print out the values correctly. Here's a
> simplified version of what I'm trying to to:

Hello Ed

>    use strict;
>    use warnings;
>    use Class::Struct;
>
>    struct ( Shoppe => {          # Creates a Shoppe->new() constructor.
>        owner   => '$',         # Now owner() method accesses a scalar.
>        addrs   => '@',         # And addrs() method accesses an array.
>        stock   => '%',         # And stock() method accesses a hash.
>    });
>
>    my $store = Shoppe->new();
>
>    $store->owner('Abdul Alhazred');
>    $store->addrs(0, 'Miskatonic University');
>    $store->addrs(1, 'Innsmouth, Mass.');
>    $store->stock("books", 208);
>    $store->stock("charms", 3);
>    $store->stock("potions", "none");
>
>
[...]
>    # dereference the hash method.
>    print "stock: %{$store->stock}";   ### <---FAILS! Prints out the
>                                       ### ref again with a % in front...

Variables starting with '%' are not interpolated in strings...

$ perl -Mstrict -Mwarnings -le 'my %h=(a=>qw{b}); print "%h";'
%h

...whereas variables starting with '@' are:

$ perl -Mstrict -Mwarnings -le 'my @a=(a=>qw{b}); print "@a";'
a b

"Workaround" (see at the end of the post for an explanation):

$ perl -Mstrict -Mwarnings -le 'my %h=(a=>qw{b}); print "@{[ %h ]}";'
a b

And since you additionally want to dereference a hash ref:

$ perl -Mstrict -Mwarnings -le 'my $href={a=>qw{b}}; print "@{[ %$href ]}";'
a b

This means, for your example:

print "stock: @{[ %{$store->stock} ]}";

[...]
>    # but how do you print the store owner directly? The following fails!

It fails because $store->owner returns a scalar, and not a scalar ref that you 
had to dereference:

$ perl -Mstrict -Mwarnings -le 'my $sref=\q{ab}; print "${$sref}";'
ab

The same, shortened:

$ perl -Mstrict -Mwarnings -le 'my $sref=\q{ab}; print "$$sref";'
ab


>     print "owner:, ${$store->owner}";

You mean, how do you interpolate it into a string? As I mentioned in my 
previous post:

print "owner: @{[ $store->owner ]}\n";

With the @{[]} construct you can interpolate everything into a string that is 
a "set" of scalars (a scalar, a list, an array, a hash).

The [] provides an anonymous arrayref, and the @{} dereferences it (again).


In short, 
${} and @{} are interpolated, 
%{} is not.


hth!

Dani

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to