I’m trying to print duplicate lines from the filehandle, not remove them or anything else I see asked on other questions. I don’t have enough experience with perl to be able to quickly do this, so I’m asking here. What’s the way to do this?
I’m trying to print duplicate lines from the filehandle, not remove them or anything
Share
Using the standard Perl shorthands:
As a “one-liner”:
More data? This prints
<file name>:<line number>:<line>:Explanation of
%seen:%seendeclares a hash. For each unique line in the input (which is coming fromwhile(<>)in this case)$seen{$_}will have a scalar slot in the hash named by the the text of the line (this is what$_is doing in the has{}braces).x++) we take the value for our expression, remembering to increment it after the expression. So, if we haven’t “seen” the line$seen{$_}is undefined–but when forced into an numeric “context” like this, it’s taken as 0–and false.So, when the
whilebegins to run, all lines are “zero” (if it helps you can think of the lines as “not%seen“) then, the first time we see a line,perltakes the undefined value – which fails theif– and increments the count at the scalar slot to 1. Thus, it is 1 for any future occurrences at which point it passes theifcondition and it printed.Now as I said above,
%seendeclares a hash, but withstrictturned off, any variable expression can be created on the spot. So the first time perl sees$seen{$_}it knows that I’m looking for%seen, it doesn’t have it, so it creates it.An added neat thing about this is that at the end, if you care to use it, you have a count of how many times each line was repeated.