http://qs321.pair.com?node_id=189032


in reply to 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!

I'm not sure what you mean by
while (my $line_holder = <FILE>) { foreach etc...

That is certainly != to what I wrote....
while(<FILE>){ my $line_holder = $_; #GOTCHA foreach my $val(@lines){

Which is something I do in tons of code I have written at work and it works fine?? Perhaps I am missing something?
TexasTess
"Great Spirits Often Encounter Violent Opposition From Mediocre Minds" --Albert Einstein
Waiting to see just how fast this makes it to an all time negative record...and wondering if any of the downvoters think I care :-)

Replies are listed 'Best First'.
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
    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
      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... :-)