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

I'll give the example, then
use Test::More tests => 2; sub uinq { @_ = 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;

Replies are listed 'Best First'.
Re^11: Remove redundency from an array
by mwah (Hermit) on Sep 24, 2007 at 21:05 UTC
    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

      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