use strict; my %locks; while (chomp(my $line = )) { 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}); }