# Lib siren package package lib::siren; # Best practice use strict; use warnings; # Use carp my $debug = 0; if ($debug) { use Carp qw(carp); } # Constructor sub new { # Extract params my ($class) = @_; # Create self hash my $self = { sirens => {}, unique => 0, duplicate => 0 }; # Link self to package bless($self, $class); # Return self object return $self; } # Parse file sub parse { my ($self, $file) = @_; # Open file open(my $fh, '<', $file) or die $!; # Load file in hash map { # Trim line chomp; # Skip invalid siren if (! /^[0-9]{9}$/) { if ($debug) { carp $_.' do not seems to be a valid siren'."\n"; } # Treat valid siren } else { # First meeting if (! defined($self->{sirens}{$_})) { # Add siren to hash $self->{sirens}{$_} = 1; # Grow unique number $self->{unique}++; # Second encounter } else { # Grow siren occurence number $self->{sirens}{$_}++; # Move siren from unique to duplicate category if ($self->{sirens}{$_} eq 2) { $self->{unique}--; $self->{duplicate}++; } } } } <$fh>; # Close file close($fh) or die $!; # Return self return $self; } # Show result sub show { my ($self) = @_; # Print result return 'Unique'.($self->{unique} gt 1?'s':'').': '.$self->{unique}.', duplicate'.($self->{duplicate} gt 1?'s':'').': '.$self->{duplicate}."\n"; } 1;