in reply to Re^4: setting PERL_PERTURB_KEYS & PERL_HASH_SEED in a perl file
in thread setting PERL_PERTURB_KEYS & PERL_HASH_SEED in a perl file

Hi,

Lets say we have this hash:

$hash{a} = 0; $hash{b} = 1; $hash{c} = 0; $hash{d} = 3;

The expected output is:

a = 0 c = 0 b = 1 d = 3

or

c = 0 a = 0 b = 1 d = 3

(note how 'a' & 'c' are switched)

Both are correct!

However, for consistency, I rather have always the same output.

The code that I'm using is:

foreach my $k ( sort { $hash{$a} <=> $hash{$b} } keys %hash ) { print "$k = $hash{$k}\n"; }

Thx

Guy

Replies are listed 'Best First'.
Re^6: setting PERL_PERTURB_KEYS & PERL_HASH_SEED in a perl file (sort)
by tye (Sage) on Jul 18, 2016 at 13:20 UTC
    sort { $hash{$a} <=> $hash{$b} || $a cmp $b }
    I was sure that whatever written inside a BEGIN statement is hapannig before everything else, so I'm not sure why my first attempt did't wok

    So you thought that the Perl code in a BEGIN block would be run by the perl interpreter before the perl interpreter was initialized? Surely it is not hard to see why that is not the case.

    - tye        

Re^6: setting PERL_PERTURB_KEYS & PERL_HASH_SEED in a perl file
by haukex (Archbishop) on Jul 18, 2016 at 13:21 UTC

    Hi gravid,

    Yep, there's a better solution than messing with Perl's internals :-)

    my %hash = ( a=>0, b=>1, c=>0, d=>3 ); foreach my $k ( sort { $hash{$a} <=> $hash{$b} or $a cmp $b } keys %ha +sh ) { print "$k = $hash{$k}\n"; }

    Always outputs:

    a = 0 c = 0 b = 1 d = 3

    Background: If the comparison of the values (<=>) shows they are equal it returns zero, so then the second part of the or expression is evaluated, comparing the keys.

    Update: See the multi-field sort in How do I sort an array by (anything)? That FAQ answer also references this article: Far More Than Everything You've Ever Wanted to Know About Sorting

    Hope this helps,
    -- Hauke D

      Thx Hauke!

      This is the solution.

      Works for me great :)

      Thx

      Guy