in reply to Duplicate lines with spaces, tabs...

Simple check next unless $_; as a second line of the while cycle will do. All whitespaces from the beginning of the line were removed by $_ =~ s/^\s+//;, so $_ is empty at that time if it only contained whitespace (or nothing).

UPDATE: And regarding the duplicate "5", you'll have to trim the trailing whitespace characters as well. s/\s+$//; will help with that. For the sake of your education :-), that means: in $_, if there is a sequence of 1 or more (that's the +) whitespace characters(\s) occuring just before the end of the string ($), replace it (s/.../.../) with nothing (the nothing between the last two slashes)

UPDATE2: As pointed out by moritz, you'll have to add a newline to the print statement if all trailing whitespaces including the newline were trimmed. The body of the while loop will look like

s/^\s+//; s/\s+$//; next unless $_; $seen{$_}++; next if $seen{$_} > 1; print "$_\n";