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?
| [reply] [Watch: Dir/Any] |
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,
| [reply] [Watch: Dir/Any] [d/l] [select] |
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.
| [reply] [Watch: Dir/Any] [d/l] |