On Sat, Jul 24, 2004 at 08:57:56AM -0400, Dalton Marris wrote: > I am trying to understand the use of "sub" in the second "foreach > $daynum" loop in the code shown below. I know it's an anonymous sub, > but can't figure out why it's needed, if it indeed is. I have read the > perlref and perlsub documents, and googled for information, to no avail. > > Some things I have noticed regarding the first and second "foreach > $daynum" loops: > > When I step through the first "foreach $daynum" loop with Komodo, it > seems to hang on the "foreach" as each combination of $a and $b values > is sorted. Stepping continues after everything is sorted. The > resultant output file contains the following (as expected): > > 946684800|Holiday 1|Holiday 2 > 950486400|Holiday 3 > 954547200|Holiday 5 > 977702400|Holiday 7|Holiday 8 > > When stepping through the second "foreach $daynum" loop, it only takes > one step before it continues on, so it appears to be faster. However, > it also results in an extra key, for some reason. The resultant output > file contains the following: > > 946684800|Holiday 1|Holiday 2 > 950486400|Holiday 3 > 954547200|Holiday 5 > 977702400|Holiday 7|Holiday 8 > CODE(0x198f04c) > > My questions: > > (1) What should the "sub" be doing?
It is a bug. It shouldn't be there. > (2) Where is the "CODE(0x198f04c)" coming from? The first sort is using the specified subroutine {$a<=>$b} to sort numerically. The second sort is using the default sort subroutine ({$a cmp $b }), but also sorting the sub {$a<=>$b} along with what you want to sort. "CODE(0x198f04c)" is what you are getting when the sub is stringified. In your case the <=> and cmp sorts are the same, but try changing adding 99 and 1000000000 as keys and you will see the problem. > #!/usr/bin/perl -w > use strict; > > my $dayentry; > my $daynum; > my $dbrow; > > my %dayinfo = ( > 977702400 => [ "Holiday 7", > "Holiday 8" ], > 950486400 => [ "Holiday 3" ], > 946684800 => [ "Holiday 1", > "Holiday 2" ], > 954547200 => [ "Holiday 5" ], > ); > > open( DBFILE, ">dbfile1.txt" ) or die("Error: could not open > \"dbfile1.txt\"\n" ); > > foreach $daynum (sort{$a<=>$b} keys %dayinfo ) { > $dbrow = "$daynum"; > foreach $dayentry (@{$dayinfo{$daynum}}) { > $dbrow = join('|',$dbrow,$dayentry); > } > # write new data to output file > print( DBFILE "$dbrow\n" ); > } > close( DBFILE ); > > open( DBFILE, ">dbfile2.txt" ) or die("Error: could not open > \"dbfile2.txt\"\n" ); > > foreach $daynum (sort(sub{$a<=>$b}, keys %dayinfo)) { > $dbrow = "$daynum"; > foreach $dayentry (@{$dayinfo{$daynum}}) { > $dbrow = join('|',$dbrow,$dayentry); > } > # write new data to output file > print( DBFILE "$dbrow\n" ); > } > close( DBFILE ); -- Paul Johnson - [EMAIL PROTECTED] http://www.pjcj.net -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] <http://learn.perl.org/> <http://learn.perl.org/first-response>