Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change
 
PerlMonks  

Re^2: How to perform different sorts on multiple sections of items in the same array (optimised)

by BrowserUk (Patriarch)
on Dec 29, 2014 at 15:15 UTC ( [id://1111629]=note: print w/replies, xml ) Need Help??


in reply to Re: How to perform different sorts on multiple sections of items in the same array
in thread How to perform different sorts on multiple sections of items in the same array

Updated: added missing declaration per trippledubs's report below.

A somewhat more optimal version that avoids multiple greps and re-testing of some conditions:

#! perl -slw use strict; my @data = qw[ alpha bravo charlie delta east echo exit foxtrot golf hotel india +juliet kilo lima mike november oscar papa quebec romeo sierra tango uniform victor whisk +ey xray yankee zulu ]; my @sortedData; my( @rindex, @eindex, @oindex ); push @{ $data[ $_ ] =~ m[r] ? \@rindex : $data[ $_ ] =~ m[^e] ? \@eind +ex : \@oindex }, $_ for 0 .. $#data; my @rsorted = sort{ $data[ $a ] cmp $data[ $b +] } @rindex; my @esorted = sort{ substr( $data[ $a ], 2, 1 ) cmp substr( $data[ $b +], 2, 1 ) } @eindex; my @osorted = sort{ substr( $data[ $b ], -1 ) cmp substr( $data[ $a +], -1 ) } @oindex; @sortedData[ @rindex, @eindex, @oindex ] = @data[ @rsorted, @esorted, +@osorted ]; print for @sortedData;

With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.

Replies are listed 'Best First'.
Re^3: How to perform different sorts on multiple sections of items in the same array (optimised)
by trippledubs (Deacon) on Dec 30, 2014 at 05:25 UTC

    Whaaaaaat. This can't work under strict. How is this magic of taking an array like \@rindex before it is defined. Is it being defined in the push statement? I don't understand how that works. Under perltidy it kind of makes more sense, it looks like the ternary operator is used as a branching statement. But what array is it pushing to?.. ohh okay it is pushing to either rindex, eindex, or oindex depending on what match is found.. if that is what is going on, that is really sweet. Is that what is going on here? I printed this out and I'm just staring at it.

    is it referencing and dereferencing in the same line.. why is that necessary?

      This can't work under strict.

      Correct, it doesn’t compile. It seems BrowserUk forgot to declare @rindex, @eindex, and @oindex.

      But what array is it pushing to?.. ohh okay it is pushing to either rindex, eindex, or oindex depending on what match is found.. if that is what is going on, that is really sweet. Is that what is going on here?

      Yes, exactly.

      is it referencing and dereferencing in the same line.. why is that necessary?

      Yes. Try it the straigtforward way:

      push ($data[ $_ ] =~ m[r] ? @rindex : $data[ $_ ] =~ m[^e] ? @eindex : + @oindex), $_ for 0 .. $#data;

      and you get syntax errors. The conditional operator’s first argument, the expression $data[ $_ ] =~ m[r], is not part of an assignment, so it’s in void context, which is a form of scalar context. Now, perlop#Conditional-Operator says:

      Scalar or list context propagates downward into the 2nd or 3rd argument, whichever is selected.

      So @rindex, @eindex, or @oindex (whichever is selected) will be evaluated in scalar context, which returns the number of elements in the array, not the array contents. To get the contents, BrowserUk returns an array reference (which is OK here, it’s a scalar), and then gets the array contents by dereferencing.

      Hope that helps,

      Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,

      Whaaaaaat. This can't work under strict.

      I forgot (now corrected; thanks) to copy-paste the declaration of the 3 arrays. my( @rindex, @eindex, @oindex );

      It is there in my benchmark, but was common code used by 4 different paths through the code that tested different optimisations.


      With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      "Science is about questioning the status quo. Questioning authority".
      In the absence of evidence, opinion is indistinguishable from prejudice.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1111629]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others lurking in the Monastery: (7)
As of 2024-03-28 12:51 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found