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

OK, this case *would* be solved by
a local $_ before the do block (I confess ..)

use strict; use warnings; use Test::More tests => 2; sub uinq { local $_; @_ = do { @$_{@_}=(); keys %$_ } } my @array = (1,1,3,3,2,3,5,7,5,2); %$_ = ( f=>'oo', b=>'ar' ); is keys(%$_), 2; print "@{[ uinq @array ]}\n"; is keys(%$_), 2;

That correction seems to be all what's needed here.
Thanks for clearing this up
But now it's late ...

Regards
mwa

Replies are listed 'Best First'.
Re^12: Remove redundency from an array
by ikegami (Patriarch) on Sep 24, 2007 at 21:47 UTC

    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.

      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