Try this:
use strict;
my %locks;
while (chomp(my $line = <STDIN>)) {
next unless ($line =~ /Mutex(.*)::(.*)/);
my ($mutex,$action) = ($1,$2);
if ($action eq 'locking') {
if ($locks{$mutex}) {
printf ("Mutex %s already locked on line %d, locked again
+on line %d\n",
$mutex, $locks{$mutex}, $.);
} else {
$locks{$mutex} = $.;
}
} elsif ($action eq 'unlocked') {
if ($locks{$mutex}) {
delete $locks{$mutex};
} else {
printf ("Mutex %s unlocked on line %d, but wasn't locked.\
+n",
$mutex, $.);
}
}
}
foreach my $mutex (keys %locks) {
printf ("Mutex %s locked on line %d, but wasn't unlocked\n",
$mutex, $locks{$mutex});
}