Add some error trapping as recommended by Dijkstra. Not particularly necessary for this specific example but it doesn't hurt to be proactive.
Redirecting the mlijobs.txt file to STDIN:
my %licenses;%licenses<count max> = 0,0;for $*IN.lines -> $line {my ( $license, $date_time ); ( *, $license, *, $date_time ) = split /\s+/, $line;if $license eq'OUT' { %licenses<count>++;if %licenses<count> > %licenses<max> { %licenses<max> = %licenses<count>; %licenses<times> = [$date_time]; }elsif %licenses<count> == %licenses<max> { %licenses<times>.push($date_time); } }elsif $license eq'IN' {if %licenses<count> == %licenses<max> { %licenses<times>[*-1] ~= " through " ~ $date_time; } %licenses<count>--; }else {# Not a licence OUT or IN event, do nothing }};my $plural = %licenses<times>.elems == 1 ?? '' !! 's';say"Maximum concurrent licenses in use: {%licenses<max>}, in the time period{$plural}:";sayjoin",\n", %licenses<times>.list;
Example output:
Maximum concurrent licenses in use: 99, in the time periods:
2008/10/03_08:39:34 through 2008/10/03_08:39:45,
2008/10/03_08:40:40 through 2008/10/03_08:40:47