in reply to Re^2: Trying to print out only unique array values-
in thread Trying to print out only unique array values-

Close. There were a few issues with your updates. So, I think I covered those and commented the code enough to make it more understandable here:
#!/usr/bin/env perl use strict; use warnings; use List::MoreUtils qw(uniq); my $char_at=10; # Character to start grabbing data in the line my $num_chars=50; # Number of characters to grab in the line my @trnAccounts; # our array to store results # open our file open my $fh, '<', $ARGV[0] or die "Could not open '$ARGV[0]' $!"; # go through our file, line by line while (my $line = <$fh>) { chomp $line; # trim off trailing newline character first # OR, you could trim the line using regular expressions # $line =~ s/\A\s*//; # trim beginning # $line =~ s/\s*\z//; # trim end # OR, you could trim using Scalar::Util's trim or something # $line = trim($line); # skip this line completely if it doesn't contain the info we want next unless $line && length($line) >= $char_at; # grab the uppercased version of the first character in the line my $first_char = uc(substr($line,0,1) || ''); # skip this line if that first character's an H or T next if ($first_char eq 'H' or $first_char eq 'T'); # otherwise, push a portion of the line onto our array push @trnAccounts, substr($line, $char_at, $num_chars); } # get a unique list of info we stored. my @unique_accounts = uniq(@trnAccounts); # arrays are zero-based. for my $i (0..$#unique_accounts) { # still zero-based, but display it as 1-based print $i+1, ":", $unique_accounts[$i], "\n"; } # print out some totals print "total: ", scalar(@trnAccounts), "\n"; print "uniq : ", scalar(@unique_accounts), "\n";
I hope that's more clear. Please speak up if something doesn't make sense. I apologize for not documenting the first attempt a bit more clearly.

Replies are listed 'Best First'.
Re^4: Trying to print out only unique array values-
by rickman1 (Novice) on Aug 17, 2016 at 16:12 UTC

    Thank you very much genio!
    I didn't realize I had not initialized my $val variable properly. That if statement is no longer nonsense and does the trick. Now header and trailer records are ignored and not processed, thus my count is accurate. I will live with the fact that the unique values it finds are displayed in a 0 based count format, no big deal as it seems to be working like a charm. BTW, did you know that your user name (genio) in spanish means genius? I am guessing you do... lol. Here is the output of a much simpler file:
    0:123456789
    1:987654321
    2:123654874
    3:785471236
    4:951234569
    5:753698741
    6:478478478
    ============
    Total Records Processed: 10
    Total Unique Values Found : 7

    And here is the modified code:

    use strict; use warnings; use List::MoreUtils qw(uniq); my $char_at=10; my $num_chars=50; my $val; my @trnAccounts; #open my $fh, $ARGV[0] #open my $fh, '<:encoding(UTF-8)', $ARGV[0] open my $fh, '<:encoding(cp1252)', $ARGV[0] or die "Could not open '$ARGV[0]' $!"; while (my $line = <$fh>) { $val = substr($line, 0, 1); chomp $val; if ($val eq 'H' or $val eq 'T') { my $output = $line; }else { chomp $line; next unless $line && length($line) >= $char_at; push @trnAccounts, substr($line, $char_at, $num_chars); } } my @unique_accounts = uniq(@trnAccounts); print "\n"; for my $i (0..$#unique_accounts) { print $i, ":", $unique_accounts[$i], "\n"; } print "============\n"; print "Total Records Processed: ", scalar(@trnAccounts), "\n"; print "Total Unique Values Found : ", scalar(@unique_accounts), "\n";

    THANK YOU GENIO!