#!/usr/bin/perl -w use strict; use feature ':5.10'; my @data=( "abcdefg\n", "hijklmno\n", "pqrstuvw\n", "\n"); my $start_lines; sub show ($\@) { $start_lines or return; my ($when,$lines)=($_[0],1+$#{$_[1]}); my $diff = $start_lines - $lines; my $prc = $diff ? 100.0*$diff/$start_lines : 0; printf "%10.10s %d -> %d lines or %.2f%% reduction\n", $when, $start_lines, $lines, $prc; } sub printar(\@) { my $ar=$_[0]; printf "\n(#lines=%d,", 0+@$ar; for (my $i=0; $i<=$#$ar; ++$i) { printf " line %d: '%s'", $i, $ar->[$i]; } print ")\n"; } sub uniq(\@) { my $ar=$_[0]; my @res; foreach (@{$ar}) { my $ans=grep /^$_$/, @res; printf "line \"%s\" in ar?: %s, ar: ", $_ // "undef" , $ans?"yes":"no"; printar @res; if (!$ans) {push @res, $_} } @res; } ### main #my @msgs=<>; my @msgs=@data; $start_lines=@msgs; show("before", @msgs); my $msgs=join "", @msgs; my @deblanked=split /\n/, $msgs; show "deblanked", @deblanked; my @uniq=uniq @deblanked; show "after uniq", @uniq;