taguti wrote: > Hello, > > I'm wondering more good or Perlish code. > > Strings are in formed "wwwHHMM", from "MON0000" to "SUN2359". > So all data in good order is: > @week = qw(MON TUE WED THU FRI SAT SUN); > for my $w (@week) { > for my $HH ('00' .. '23') { > for my $MM ('00' .. '59') { > push @all, $w . $HH . $MM; > } > } > } > > So for example, > &sortByWeek('FRI0101', 'TUE0202', 'MON2359') > is favoured to return > ('MON2359', 'TUE0202', 'FRI0101') > > My code is below, not checked well, > but I think it is too cheap, or not tricky, > I'm searching another... > > sub sortByWeek { > my @in = @_; > my %WeekNum = ('MON'=>0, 'TUE'=>1....); > my @WeekStr = ('MON', 'TUE'....); > for (@in) { > substr($_,0,3) = $WeekNum{(substr($_,0,3)} . "\x00\x00" > if defined $WeekNum{(substr($_,0,3)}; > } > @in = sort @in; > for (@in) { > substr($_,0,3) = $WeekStr[substr($_,0,1)] > if substr($_,0,3) =~ /[0123456]\x00\x00/; > } > return @in; > }
You could try something like this: my @res = &sortByWeek ('FRI0101', 'TUE0202', 'MON2359'); print "@res\n"; sub sortByWeek { my %WeekNum = ('MON'=>0, 'TUE'=>1, 'WED'=>2, 'THU'=>3, 'FRI'=>4, 'SAT'=>5, 'SUN'=>6); return map $_->[0], sort { $a->[1] cmp $b->[1] } map [$_, $WeekNum{substr ($_, 0, 3)} . substr ($_, 3, 4)], @_; } __END__ -- ,-/- __ _ _ $Bill Luebkert ICQ=162126130 (_/ / ) // // DBE Collectibles Mailto:[EMAIL PROTECTED] / ) /--< o // // http://dbecoll.tripod.com/ (Free site for Perl) -/-' /___/_<_</_</_ Castle of Medieval Myth & Magic http://www.todbe.com/ _______________________________________________ Perl-Unix-Users mailing list [EMAIL PROTECTED] To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs