in reply to remove duplicates with hash and grep

@array is empty cause never populated.

warnings and strict would have told you...

Cheers Rolf

(addicted to the Perl Programming Language and ☆☆☆☆ :)

  • Comment on Re: remove duplicates with hash and grep

Replies are listed 'Best First'.
Re^2: remove duplicates with hash and grep
by Smith (Initiate) on Dec 22, 2014 at 22:04 UTC

    Change it to this and am now getting the list but it has not removed the duplicates. Still lost

    #!/usr/bin/perl use warnings; use strict; my $upload = "/var/tmp/work/upload"; my $work = "/var/tmp/work/STAP-domain_clean_project"; my $input3 = "$upload/domain.csv"; system ("dos2unix $input3"); open (IN,"$input3"); open (OUT,">>$work/local.rules"); while (<IN>) { chomp(); if ($_ =~ /^.+\.([A-Za-z0-9-_]+\.[A-Za-z]{2,})$/){ my @array = $1; my %seen = (); my @unique = grep { ! $seen{ @array }++ } @array; print "@unique\n"; } }

      Your code redefines %seen and @array each time you read a line from your file. You get duplicates because your hash is always empty when you test it for a value.

      The following will produce a list of the unique values from IN:

      my (%seen,@unique); while (<IN>) { chomp; $seen{$1}++ if ($_ =~ /^.+\.([A-Za-z0-9-_]+\.[A-Za-z]{2,})$/); } @unique = keys %seen; printf "%s, ",$_ for @unique; print "\n";

      Updated for readability and coherence and typos (is it Monday already?)

      1 Peter 4:10

        Thank you! I understand now

      ... now getting the list but it has not removed the duplicates.
      ...
          my @array = $1;

      On every iteration through the while-loop, this statement creates a new array and initializes it with a single element: the string that was captured to $1. This string is, of course, unique!