in reply to Re^8: Saving sql results to an array all rows?
in thread Saving sql results to an array all rows?

As Krambambuli noted, the @sorted1 code is correct and the @sorted isn't. In the wrong one, you're applying split to an array reference.

Seeing as how you are sorting ip adresses, you could simplify this sort routine using Socket's function inet_aton.

#!/usr/bin/perl use strict; use warnings; use Socket; use Data::Dumper; my @data = map{[split]} <DATA>; print Dumper \@data; my @sorted = map{$_->[0]} sort {$a->[1] cmp $b->[1]} map { [$_, inet_aton($_->[1]) ]} @data; print Dumper \@sorted; __DATA__ alpha 2.23.14.71 beta 10.23.14.71 gamma 25.26.1.6 delta 1.2.3.4 epsilon 10.24.14.71
Socket is included with perl 5.8.8 at least, and likely for earlier versions of perl.

Replies are listed 'Best First'.
Re^10: Saving sql results to an array all rows?
by learningperl01 (Beadle) on Aug 21, 2008 at 15:21 UTC
    Cristoforo thanks for the reply, however when using the code you provided I get the same results correct results but unsorted. Any ideas? I changed my query to only return two rows so it would closely follow your example. Below are the results. Thanks
    my @data = map { [$_, split(/\./, (split /\s+/, $_)[1])]} @al +l_rows; #print Dumper @data; my @sorted = map{$_->[0]} sort {$a->[1] cmp $b->[1]} map { [$_, inet_aton($_->[1]) ]} @data; print Dumper @sorted; } Results $VAR1 = [ [ '2008-07-26', '13.168.1.1' ] ]; $VAR2 = [ $VAR1->[0] ]; $VAR1 = [ [ '2008-07-26', '10.169.1.1' ] ];
      Well, you're almost there. You don't need the code line

      my @data =  map { [$_, split(/\./, (split /\s+/, $_)[1])]} @all_rows;

      That isn't necessary. I don't know why you did that! You transformed @all_rows using the same buggy code Krambambuli noted in his last post. Try the code below, without the transformation.

      my @sorted = map{$_->[0]} sort {$a->[1] cmp $b->[1]} map { [$_, inet_aton($_->[1]) ]} @all_rows; print Dumper \@sorted;

      (Also, leave the backslash before print Dumper \@sorted;. It's there to print out the array as a whole using Data::Dumper. Did you paste my example code and run it?)

        Yeah I ran the sample code that you have and saw that the IP's were properly sorted(as they should be). Here is the code that I got, but I am still getting unsorted results??? FYI I changed where the sorting fell in the loop since it was only giving me the first result then moving on to the next one. Below are the sample results, like I mentioned they are not getting sorted and I am not sure why? Thanks for the help once again!
        foreach my $line (@lines) { $sth->execute($line, $line) or die "Can't execute SQL statemen +t: $DBI::errstr\n"; my @all_rows; while ( my $ref = $sth->fetchrow_arrayref()) { push(@all_rows, $ref); my @sorted = map{$_->[0]} sort {$a->[1] cmp $b->[1]} map { [$_, inet_aton($_->[1]) ]} @all_rows; print Dumper \@sorted; } } -------------------------------------------------------- Results: FYI there are three entries in the file which is save to the +@line array so three results shown below. $VAR1 = [ [ '2008-07-26', '10.10.10.1' ], $VAR1->[0], $VAR1->[0], ]; $VAR1 = [ [ '2008-07-26', '192.168.1.32' ], $VAR1->[0], $VAR1->[0], $VAR1->[0], $VAR1->[0], $VAR1->[0], $VAR1->[0], $VAR1->[0] ]; $VAR1 = [ [ '2008-07-26', '1.1.1.1' ], $VAR1->[0], $VAR1->[0], $VAR1->[0], $VAR1->[0], $VAR1->[0], $VAR1->[0], $VAR1->[0], $VAR1->[0], $VAR1->[0], $VAR1->[0], $VAR1->[0], $VAR1->[0], ];