in reply to Re^11: Remove redundency from an array
in thread Remove redundency from an array

That still modifies a global variable ...or ast least, it's suppose to. I found that it doesn't modify %{''} as it should! Your code is excercising a Perl bug! This gets better all the time.

Again, easily solved by replacing
sub uinq { local $_; @_ = do { @$_{@_}=(); keys %$_ } }
with the simpler, safer
sub uinq { local %_; @_{@_}=(); keys %_ }

What's with the useless do?
What's with the useless assignment to @_?
Why use a reference when one isn't needed?
Why use a symbolic reference when one isn't needed?
Using the symbolic reference means there's now another variable to localize.
That is, if the code didn't rely on a Perl bug.

Replies are listed 'Best First'.
Re^13: Remove redundency from an array
by mwah (Hermit) on Sep 25, 2007 at 06:36 UTC
    ikegami:What's with the useless do?

    That has (1.) been carried over from the non-sub expression
    and (2.) it was too late (in the evening) to make substantial changes...

    ikegami:What's with the useless assignment to @_?

    This is clearly necessary when using the do{} block in its original context

    ikegami:Why use a reference when one isn't needed?

    I'd *never ever* use a reference if it isn't needed, but my
    perl588 doesn't complain about abusing $_ this way ;-)

    ikegami:Using the symbolic reference means there's now another variable to localize.

    OK, but which one?

    ikegami:That is, if the code didn't rely on a Perl bug?

    Or, "didn't rely on a Perl feature"? I don't really know.


    BTW, your version using %_ impicitely by @_ is very nice.
    I'd recommend to put this one
    sub uinq { local %_; @_{@_}=(); keys %_ } my @array = (1,1,3,3,2,3,5,7,5,2); print join ',', uinq(@array), "\n"

    somwhere into perldoc (necessity shown by other posts).
    Thanks for your engagement!

    Regards mwa