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

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,

  • Comment on Re^4: How to perform different sorts on multiple sections of items in the same array (optimised)
  • Select or Download Code