in reply to Dereferencing hashrefs

Both the approaches you cited (%$hashref and %{$hashref} are correct. (The {}s work like parenthesies. I've often wondered why {}s are used in this context, not ()s. Anybody?)

What errors are you getting? Are you sure DBI::fetchrow_hashref() is returning a hashref? Clearly, it /should/, but probably returns undef on errors. Try printing out the returned value; if it is a hashref, it'll say HASH(0xyadda). (If it's a blessed hashref, it'll be Some::Class=HASH(0xyadda.)

TACCTGTTTGAGTGTAACAATCATTCGCTCGGTGTATCCATCTTTG ACACAATGAATCTTTGACTCGAACAATCGTTCGGTCGCTCCGACGC

Replies are listed 'Best First'.
Re:x2 Dereferencing hashrefs (why {} and not ())
by grinder (Bishop) on Feb 11, 2002 at 09:32 UTC
    The {}s work like parenthesies. I've often wondered why {}s are used in this context, not ()s.

    Curlies are used, and not parentheses, because you are actually using code blocks here. It just so happens that usually the block in question is just the contents of a scalar (which happens to be a reference to something)).

    There is nothing stopping you from putting more advanced code into that block, such as:

    for my $key( keys %{$moon->phase > 0.25 ? $thisref : $thatref} ) { ... } # or, more likely to be encountered push @{$val % 2 ? \@odds : \@evens}, $val;

    But those who come after may not always appreciate your doing so. If you really feel the urge to get fancy, consider calling a subroutine in the code block, if only to let the person drop a breakpoint on the sub so that they can follow exactly what reference is being used.

    g r i n d e r
    print@_{sort keys %_},$/if%_=split//,'= & *a?b:e\f/h^h!j+n,o@o;r$s-t%t#u';
Re: Re: Dereferencing hashrefs
by Sweeper (Pilgrim) on Feb 11, 2002 at 22:28 UTC
    The {}s work like parenthesies. I've often wondered why {}s are used in this context, not ()s. Anybody?)

    Perl was initially based on C, sh and awk. The syntax $foo is inherited from sh, and like in sh, there were some problems if the variable was followed by a string. So, like in sh, there is the alternate syntax ${foo}.

    And then, there is the backward compatibility Perl 1 -> Perl 2 -> Perl 3 etc. This is why curlies have remained, and are still there.

    There might be another reason. There is a special variable $( ($GID), so with $(foo), there would be some ambiguous parsing. There is no special variable consisting of a dollar and a single open curly, so parsing ${foo} not ambiguous.