AWallBuilder has asked for the wisdom of the Perl Monks concerning the following question:

Hi all, I am new to hash references so I am not too familiar with all of the related basics.

I have made a hash or arrays HoCl. For each Cluster_num there is a list of members. I want to find for each pair of members how many of the same clusters they belong to $overlap. The script is working as expected (before I added the line about 0). But i want the overlap value to be 0 as a default. How do I set the default value for overlap? Thank you

my $overlap = {}; foreach $Cluster_Num (keys %HoCl){ my @members=@{$HoCl{$Cluster_Num}}; my $count = scalar(@members); for (my $i=0;$i<$count;$i++){ for (my $j=$i+1;$j<$count;$j++) { $overlap -> {$members[$i]} -> {$members[$j]} = 0; $overlap -> {$members[$i]} -> {$members[$j]} ++; $overlap -> {$members[$j]} -> {$members[$i]} ++; } } }

Replies are listed 'Best First'.
Re: how to set a value for a hash reference
by moritz (Cardinal) on Mar 14, 2012 at 12:57 UTC

    The easiest thing is not to set the default, but apply the default while reading the value in the end, like my $ov = $overlap->{$a}{$b} // 0 (requires perl 5.10 or newer, but older versions than 5.12 aren't maintained anyway).

    By the way a nicer way to write the inner loops is

    my $last = @members - 1; for my $i (0 .. $last) { for my $j ($i + i .. $last) { $overlap->{$members[$i]}{$members[$j]}++; $overlap->{$members[$j]}{$members[$i]}++; } }

      thank you for the details and the loop suggestion. The "//" means if for a and b overlap doesn't exist then it equals zero, right?

      But where would I put this line? after the loop? no -> between the $a and $b? would I have to embed it in a loop with a and b being all elements of members?

        The "//" means if for a and b overlap doesn't exist then it equals zero, right?

        Correct. It's the "defined-or" operator.

        But where would I put this line? after the loop?

        Wherever your read the values of $overlap.

Re: how to set a value for a hash reference
by Anonymous Monk on Mar 14, 2012 at 15:41 UTC

    A hash consists of "values" indexed by "strings." Those "values" can be discrete numbers, or references to anything-at-all.

    If the value that you are reading isn't there, you get "undef."

    If you are setting a value, as with "++", or referring to a not-yet existing hash entry on a more complicated assignment statement, Perl automagically creates ("auto-vivifies") the necessary entries on-the-fly, giving them (in the case of "++") an initial value of zero. In other words, "if the success of this statement relies upon the value being there, such that the programmer would have to waste time and resources checking-first but for no other purpose, just cause it to be there ... thus saving valuable computer-time in a convenient action that is obviously correct."