[comp.lang.perl] Yet another BUG in sort and package in PL#37

ishii@hexard.co.jp (Koji Ishii) (10/28/90)

     Larry said $a and $b in sort function is bound to current package
at PL#36.  But it seems to have a bug, please look at package yy in
following sample.  Here, $a and $b are not bound to package yy but
package xx.

     I wonder why they are bound to such names as $a and $b, not to
$_[0] and $_[1].  This is the only case where perl requires special
names to programmers.  Could you explain if I'm missing something?

hxrdgw:~/unnews/test[21]% perl28 sorttest.pl
28:1 4 5 9:
36:9 5 4 1:
28:1 4 5 9:
36:9 5 4 1:
XX:9 5 4 1:
hxrdgw:~/unnews/test[22]% perl sorttest.pl
28:9 5 4 1:
36:1 4 5 9:
28:9 5 4 1:
36:9 5 4 1:
XX:1 4 5 9:

#!/usr/bin/perl
&sorttest( 9, 5, 4, 1 );
&sorttest2( 9, 5, 4, 1 );

package xx;

sub numerical28 { $main'a - $main'b; }
sub numerical36 { $a - $b; }

sub main'sorttest {
    local( @x ) = sort xx'numerical28 @_;
    print "28:@x:\n";
    @x = sort xx'numerical36 @_;
    print "36:@x:\n";
}

package yy;

sub numerical28 { $main'a - $main'b; }
sub numerical36 { $a - $b; }
sub numerical36_bug { $xx'a - $xx'b; }

sub main'sorttest2 {
    local( @x ) = sort yy'numerical28 @_;
    print "28:@x:\n";
    @x = sort yy'numerical36 @_;
    print "36:@x:\n";
    @x = sort yy'numerical36_bug @_;
    print "XX:@x:\n";
}
--
----------------------------------
   Koji Ishii  Hexard Inc., Tokyo, Japan.     JUNET: ishii@hexard.co.jp

lwall@jpl-devvax.JPL.NASA.GOV (Larry Wall) (10/28/90)

In article <ISHII.90Oct28161346@hxrdgw.hexard.co.jp> ishii@hexard.co.jp (Koji Ishii) writes:
: 
:      Larry said $a and $b in sort function is bound to current package
: at PL#36.  But it seems to have a bug, please look at package yy in
: following sample.  Here, $a and $b are not bound to package yy but
: package xx.

Yep, it's a bug.  It's binding to the $a and $b of the first package in
which a sort is called.  The result of a bit of leftover code that
assumed that packages were purely lexical.

Well, hey, this is why it isn't version 4.0 yet...

:      I wonder why they are bound to such names as $a and $b, not to
: $_[0] and $_[1].  This is the only case where perl requires special
: names to programmers.  Could you explain if I'm missing something?

It's only for efficiency.  It's more overhead to set up an array than
a couple of scalar variables and more overhead to dereference the array
elements once they're in the array, and since the sort routine gets called
very heavily, we compromise a little.  Besides, it makes the sort routines
look almost algebraic.  :-)

Larry