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.
In reply to length() and the Schwartzian transform by hazylife
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |