Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl-Sensitive Sunglasses
 
PerlMonks  

Re: Re: Re: Re: Unique array w/o repeated elements and still keep the original order!

by DamnDirtyApe (Curate)
on Aug 09, 2002 at 20:46 UTC ( #189041=note: print w/replies, xml ) Need Help??


in reply to Re: Re: Re: Unique array w/o repeated elements and still keep the original order!
in thread Unique array w/o repeated elements and still keep the original order!

That is certainly != to what I wrote....

Exactly the point. In your code, each iteration of the loop assigns the next row to $_ (your while statement), then assigns the following line to $line_holder. The line assigned to $_ is never handled, so it just get's "skipped."

In any case, couldn't the whole process be reduced to

my %seen = () ; my @uniq_rows = grep { !$seen{$_}++ } <FILE> ;

?


_______________
DamnDirtyApe
Those who know that they are profound strive for clarity. Those who
would like to seem profound to the crowd strive for obscurity.
            --Friedrich Nietzsche

Replies are listed 'Best First'.
Re: Re: Re: Re: Re: Unique array w/o repeated elements and still keep the original order!
by demerphq (Chancellor) on Aug 09, 2002 at 21:05 UTC
    Er just a thought but any time ive written that code ive ended up changing it to
    my @unique=map{chomp; $_{$_}++ ? () : $_} <FILE>;
    or something like it (i dont always use %_ but sometimes i do, blame ABIGAIL-II ;-)

    To be honest i think that in my perl career ive only used a grep a few times. map seems to be so much more useful in that it can do grep()s job, and more as well!

    Yves / DeMerphq
    ---
    Software Engineering is Programming when you can't. -- E. W. Dijkstra (RIP)


      And when i write something like that i usually change it to something like:
      my %seen; my @unique = grep {not $seen{$_}++} <FILE>; chomp @unique;
      Or something similar. It might not be the best way to do it, but it has one advantage...

      It has nothing to do with using %_. It's mostly because i'm very wary of changing $_ in map, especially since i recently got very burned by attempting such a thing...

      jynx

      update: at prompting, i'll mention that one could write that as:

      my (%seen, @unique); chomp( @unique = grep {not $seen{$_}++} <FILE> );
      however, i think that would iterate twice as well. Then again there's that point about premature optimization... ;-)

      Update 2: after doing a benchmark, i've found that the map solution is the fastest, followed by the one-line chomp and last is the two-liner. The one-liner is sufficiently fast enough that i would still prefer it, although for readability and maintainability i might still go with the two line version. To each their own...

      Thanks demerphq for the learning experience... :-)

        Heh, its to avoid the code you posted (and the implicit overhead of going through the list twice) that makes me use map{} instead.

        I assume you somehow tried to change the value of constants or something like that?

        BTW, i know the above could be represented as premature optimization, but the idea of iterating over a list twice for no good reason makes me unhappy.

        :-)

        Yves / DeMerphq
        ---
        Software Engineering is Programming when you can't. -- E. W. Dijkstra (RIP)

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://189041]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others lurking in the Monastery: (6)
As of 2023-05-30 17:15 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found

    Notices?