in reply to Using Tie::IxHash to keep database query keys/values in order

"I want to keep the keys/values in the same order for every array element in an AoH ref."

You just cant do that. You could instruct data dumper to PRINT them in sorted order (local $Data::Dumper::Sortkeys=1;), or you could program your own print loop to print them in a certain order,

use strict; use warnings; my $data= [ { 'lastname' => 'Smith', 'city' => 'Chicago', 'state' => 'IL', 'firstname' => 'Jim' }, { 'city' => 'Cleveland', 'state' => 'OH', 'firstname' => 'Susan', 'lastname' => 'Jones' }, { 'state' => 'FL', 'lastname' => 'Waters', 'firstname' => 'Sam', 'city' => 'Miami' } ]; my @order=qw/firstname lastname city state/; my $rowct=0; for my $row (@$data) { printf "%5i \n",$rowct++; for my $ordername (@order) { printf " %20s %-20s \n",$ordername,$row->{$ordername}; } }
but you cannot make perl keep them in any sort of "order" than the one it decides on.

Replies are listed 'Best First'.
Re^2: Using Tie::IxHash to keep database query keys/values in order
by huck (Prior) on Feb 15, 2017 at 23:00 UTC

    As an interesting alternative to the qw/.../ you may find some interesting info about getting the field names from the sql request at Re: Field names from DBI? . that would allow you to specify the order via the SELECT statement, but it a two step setup described in setting up and executing the SQL. YMMV

Re^2: Using Tie::IxHash to keep database query keys/values in order
by bradcathey (Prior) on Feb 15, 2017 at 23:09 UTC

    So Data::Dumper is throwing me off and Tie::IxHash just might be keeping them in order as advertised. I'll write a loop to check that. Thanks for the lesson in D::D

    —Brad
    "The important work of moving the world forward does not wait to be done by perfect men." George Eliot
      So Data::Dumper is throwing me off and Tie::IxHash just might be keeping them in order as advertised.

      It's unlikely that Data::Dumper has anything to do with it. As others have written, my guess would be that selectall_arrayref() is returning a reference to an entirely separate hash it generates and populates internally. After all, how would this function "know" that you want it to use the hash referred to by $data to populate with the data it is to return? I can't use Tie::IxHash to produce an example ATM, but consider:

      c:\@Work\Perl\monks>perl -wMstrict -le "package Foo::Bar { sub TIEHASH {} } ;; my $data = {}; tie %$data, 'Foo::Bar'; print $data; ;; $data = return_anon_hash_ref(); print $data; ;; use Data::Dumper; print Dumper $data; ;; sub return_anon_hash_ref { return { 'sorry' => 'charley' }; } " HASH(0x3bd06c) HASH(0x3bd15c) $VAR1 = { 'sorry' => 'charley' };
      Note that the addresses of $data in the two print statements are different, as are the contents of the referents. Nothing you do with Data::Dumper is going to change this.

      Bottom line: Write your own data display loop or routine and use whatever explicit key order you want.


      Give a man a fish:  <%-{-{-{-<