Perl : Trying to deference an array after sorting it -


i writing perl script have reference array (students) of references. after adding hash references array. add the references array of students , ask user how sort them. gets confusing. not know how deference sorted array. using dumper can sorted array in unorganized output. how can deference array of hash references after sorting?

#!bin/usr/perl use strict; use warnings; use data::dumper; use 5.010; #reference var $r = \$var; deferencing $$r #reference array $r = \@var ; deferencing @$r #referenc  hash $r = \%var ; deferencing %$r  $filename = $argv[0]; $students = [];     open ( input_file , '<', "$filename" ) or die "could not open read \n ";   sub readlines{      while(my $currentline = <input_file>){         chomp($currentline);         @myline = split(/\s+/,$currentline);         %temphash = (         name => "$myline[0]",         age  => "$myline[1]",         gpa  => "$myline[2]",         ma   => "$myline[3]"         );         pushtostudents(\%temphash);     }  }  sub pushtostudents{     $data = shift;     push $students ,$data; }  sub printdata{      $command = shift;      if($command eq "sort up"){         @sortup = sort{ $a->{name} cmp $b->{name} } @$students;         print dumper @sortup;      }elsif($command eq "sort down"){         @sortdown = sort{ $b->{name} cmp $a->{name} } @$students;         print dumper @sortdown;         //find way deference make more organize user friendly read.      }else{         print "\n quit";     }   }  readlines(); #output in random, ordering of each users data random printf"please choose display order : "; $response = <stdin>; chomp $response; printdata($response); 

the problem here you're expected dumper provide organised output. doesn't. dumps data structure make debugging easier. key problem hashes explicitly unordered data structures - they're key-value mappings, don't produce output order.

with reference perldata:

note because hash initialized in order doesn't mean comes out in order.

and keys function:

hash entries returned in apparently random order. actual random order specific given hash; exact same series of operations on 2 hashes may result in different order each hash.

there whole section in perlsec explains in more detail, suffice - hashes random order, means whilst you're sorting students name, key value pairs each student isn't sorted.

i suggest instead of:

my @sortdown = sort{ $b->{name} cmp $a->{name} } @$students; print dumper @sortdown; 

you'd better off using slice:

my @field_order = qw ( name age gpa ma );  foreach $student ( sort { $b -> {name} cmp $a -> {name} } @$students ) {    print @{$student}{@field_order}, "\n"; } 

arrays (@field_order) explicitly ordered, print student fields in same sequence. (haven't tested example i'm afraid, because don't have source data, approach works sample data snippet).

if need print keys well, may need foreach loop instead:

foreach $field ( @field_order ) {     print "$field => ", $student->{$field},"\n"; } 

or perhaps more terse:

print "$_ => ", $student -> {$_},"\n" @field_order; 

i'm not sure though, that's perhaps matter of taste.


Comments

Popular posts from this blog

asp.net mvc - SSO between MVCForum and Umbraco7 -

Python Tkinter keyboard using bind -

ubuntu - Selenium Node Not Connecting to Hub, Not Opening Port -