hazylife has asked for the wisdom of the Perl Monks concerning the following question:
Hi Monks!
My question is about the following code example, taken as is from Wikipedia:
@sorted = map { $_->[0] } sort { $a->[1] <=> $b->[1] } # use numeric comparison map { [$_, length($_)] } # calculate the length of the s +tring @unsorted;
The above is pure Perl, not some generic pseudocode, and what worries me is that length() doesn't seem like a particularly good example for illustrating the concept. It has always been my understanding that in Perl, length($var) just returns whatever value is stored in the corresponding internal SV structure (Devel::Peek calls this field "CUR"; non-string/non-PV scalars don't have this attribute, more on them below). And if it is immediately available, why cache it?
What if we're "length()-sorting" an array of numeric scalars?
#!/usr/bin/perl use strict; use Devel::Peek; my @arr = (22, 5.555, 1, 4444, 333); print Dump(\@arr, @arr+0), "\n\n\n"; # at this point, there are 4 IVs and one NV in our array; # naturally, none of the elements have their length ("CUR") field set my ($retval, $just_once); my @sorted = sort { # does this alter the internal structures of our actual # array elements, turning IVs and NVs into PVIVs/PVNVs? $retval = length $a <=> length $b; print Dump \@arr, @arr+0 if !$just_once++; # of course it does! $retval; } @arr; print "\nsorted = @sorted\n";
I might be missing something here, so please correct me if I'm wrong.
|
---|
Replies are listed 'Best First'. | |
---|---|
Re: length() and the Schwartzian transform
by RMGir (Prior) on Feb 27, 2014 at 13:12 UTC | |
by tobyink (Canon) on Feb 27, 2014 at 14:54 UTC | |
by hazylife (Monk) on Feb 27, 2014 at 13:46 UTC | |
Re: length() and the Schwartzian transform
by Anonymous Monk on Mar 06, 2014 at 06:06 UTC | |
by hazylife (Monk) on Mar 06, 2014 at 09:33 UTC |