]> Raphaƫl G. Git Repositories - carabistouilles/blob - lib/siren.pm
Add missing check on malloc allocation
[carabistouilles] / lib / siren.pm
1 # Lib siren package
2 package lib::siren;
3
4 # Best practice
5 use strict;
6 use warnings;
7
8 # Use carp
9 my $debug = 0;
10 if ($debug) {
11 use Carp qw(carp);
12 }
13
14 # Constructor
15 sub new {
16 # Extract params
17 my ($class) = @_;
18
19 # Create self hash
20 my $self = {
21 sirens => {},
22 unique => 0,
23 duplicate => 0
24 };
25
26 # Link self to package
27 bless($self, $class);
28
29 # Return self object
30 return $self;
31 }
32
33 # Parse file
34 sub parse {
35 my ($self, $file) = @_;
36
37 # Open file
38 open(my $fh, '<', $file) or die $!;
39
40 # Load file in hash
41 map {
42 # Trim line
43 chomp;
44 # Skip invalid siren
45 if (! /^[0-9]{9}$/) {
46 if ($debug) {
47 carp $_.' do not seems to be a valid siren'."\n";
48 }
49 # Treat valid siren
50 } else {
51 # First meeting
52 if (! defined($self->{sirens}{$_})) {
53 # Add siren to hash
54 $self->{sirens}{$_} = 1;
55 # Grow unique number
56 $self->{unique}++;
57 # Second encounter
58 } else {
59 # Grow siren occurence number
60 $self->{sirens}{$_}++;
61 # Move siren from unique to duplicate category
62 if ($self->{sirens}{$_} eq 2) {
63 $self->{unique}--;
64 $self->{duplicate}++;
65 }
66 }
67 }
68 } <$fh>;
69
70 # Close file
71 close($fh) or die $!;
72
73 # Return self
74 return $self;
75 }
76
77 # Show result
78 sub show {
79 my ($self) = @_;
80
81 # Print result
82 return 'Unique'.($self->{unique} gt 1?'s':'').': '.$self->{unique}.', duplicate'.($self->{duplicate} gt 1?'s':'').': '.$self->{duplicate}."\n";
83 }
84
85 1;