in reply to sub routine to sort per time

Regardless of the rewrites suggested, did you do something as simple as putting in print statements to see if the code was doing what you thought it was doing?

For example, my understanding is that $a and $b are magic variables used by sort. Did you ever print out what the routine received in those variables?

A better coding style might be to pass those two values as parameters to the subroutine, and to store the result of the tests in a variable that would be passed in a return statement. Then you could display the returned value as well as the parameters, $h_a, $mn_a, etc.

Replies are listed 'Best First'.
Re^2: sub routine to sort per time
by steph_bow (Pilgrim) on Nov 26, 2008 at 14:00 UTC

    Thanks a lot apl

    Here is the program to take into account your remarks. However, there is still a problem.

    #! perl -slw use strict; use diagnostics; use Data::Dump qw[ pp ]; sub by_hour{ my ($a,$b) = @_; my $h_a; my $mn_a; my $h_b; my $mn_b; my $res; if ($a =~ /(\d\d):(\d\d)/){ $h_a = $1; $mn_a = $2; } if ($b =~ /(\d\d):(\d\d)/){ $h_a = $1; $mn_a = $2; } if ($h_a < $h_b){ $res = -1; } if ($h_a > $h_b){ $res = 1; } if ($h_a == $h_b){ if ($mn_a < $mn_b){ $res = -1; } if ($mn_a > $mn_b){ $res =1; } if ($mn_a == $mn_b){ $res = 0; } } return $res; } my %in; while (<DATA>){ m[(\d\d:\d\d) (.+)$] and push @{ $in{ $1 } }, $2; } my @keys = keys %in; my @times = sort @keys; for my $hr ( sort by_hour keys %in ) { print STDOUT "$hr\n"; } __DATA__ 11:10 A1 12:30 E4 11:30 Z4 15:50 H5 12:02 H6 12:25 B2 11:25 A8 12:30 F3 14:30 E7 12:50 E15 12:55 E16
      You still don't have the print statements showing $a, $b, $h_a, $h_b, $mn_a, $mn_b, $res.

      Notice also that you're processing two strings even if they're not formatted correctly (that is, match neither of the =~ statements, the second of which should be an else.

        Thanks apl ! Here is the updated code (still does not work), I get nothing from the print.

        #! perl -slw use strict; use diagnostics; use Data::Dump qw[ pp ]; sub by_hour{ my ($a,$b) = @_; my $h_a; my $mn_a; my $h_b; my $mn_b; print STDOUT "a is $a\n"; print STDOUT "b is $b\n"; my $res; if ($a =~ /(\d\d):(\d\d)/){ $h_a = $1; $mn_a = $2; } else{ $res = 0; } if ($b =~ /(\d\d):(\d\d)/){ $h_a = $1; $mn_a = $2; } else{ $res = 0; } print STDOUT "h_a is $h_a\n"; print STDOUT "h_b is $h_b\n"; print STDOUT "mn_a is $mn_a\n"; print STDOUT "mn_b is $mn_b\n"; if ($h_a < $h_b){ $res = -1; } if ($h_a > $h_b){ $res = 1; } if ($h_a == $h_b){ if ($mn_a < $mn_b){ $res = -1; } if ($mn_a > $mn_b){ $res =1; } if ($mn_a == $mn_b){ $res = 0; } } return $res; } my %in; while (<DATA>){ m[(\d\d:\d\d) (.+)$] and push @{ $in{ $1 } }, $2; } for my $hr ( sort by_hour keys %in) { print STDOUT "$hr\n"; } __DATA__ 11:10 A1 12:30 E4 11:30 Z4 15:50 H5 12:02 H6 12:25 B2 11:25 A8 12:30 F3 14:30 E7 12:50 E15 12:55 E16