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

Oh, I see, sorry.

Actually, both jdporter and I got it wrong.
You don't modify $_ like jdporter thought.
You don't modify %_ like I thought.

Wow, that piece of code is so incredibly bad! You modify some random variable based on the current contents of $_. Whether it'll work or not is random. Most of the time, it won't.

for ( [qw(a a b c)], [qw(d e e f)], ) { print(uinq(@$_), "\n"); # Can't coerce array into hash }
for ('a a b c', 'd e e f') { print(uinq(split), "\n"); # Can't use string ("a a b c") as a HASH + ref while "strict refs" in use }

Adding local $_; causes the a specific variable to be used. That alieviates some of the problem, but that variable needs to be localized too. Why not just use %_?

As an expression:

do { local %_; @_{@_}=(); keys %_ }

As a sub:

sub uinq { local %_; @_{@_}=(); keys %_ }

Replies are listed 'Best First'.
Re^9: Remove redundency from an array
by mwah (Hermit) on Sep 24, 2007 at 20:39 UTC
    ikekami: Wow, that piece of code is so incredibly bad! ...

    Ok, ok, this is my first day on P.M. where I played around
    some time longer and tried to get used to the viewing habits of
    the holy men.

    So I learned I can't just give a simple
    example in order to state what's meant - no, one has to treat
    each code block by Test::Harness several times in each context
    available before posting - to avoid destructive criticism.

    So be it. Thanks for introducing me to P.M.


    Regards & good night (its past 22:00 in Europe ;-)

    mwa
      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;
        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