#!/usr/bin/env perl use strict; use warnings; use autodie; die "no file given" unless @ARGV == 1; open(my $f, "<", "$ARGV[0]") or die "failed to open $ARGV[0]"; <$f> eq "mts3\n" and <$f> =~ m/mptopcom.*\n/ or die "invalid header"; my $inputsize = scalar(<$f>); my $bytes_read = read($f, my $bytes, $inputsize); die "Got $bytes_read but expected $inputsize" unless $bytes_read == $inputsize; my ($sizeL, $sdsize) = <$f> =~ m/(\d+) (\d+)\n/; my $line; foreach (1..$sizeL) { $line = <$f>; my ($vl, $vi, $vc, $vf, $vd, $unexp, $depth, $tail) = $line =~ m#(\d+) (\d+) (\d+) (\d+) (\d+) (\d+) (\d+) (.*)$# or die "invalid content for L at line $_ of $sizeL:\n$line\n"; my ($topcomdata) = $tail =~ m#(?: \d+){$vl}(?: \d+){$vi}((?: .){$vc})(?: [\d\.\-]){$vf}(?: [\d\.\-]+){$vd}$# or die "invalid tail for L at line $_ of $sizeL:\n$tail\n"; $topcomdata =~ s# (.)#$1#g; $topcomdata =~ m#\[.*\]\0# or die "invalid topcom data at line $_:\n$topcomdata\n"; } foreach (1..$sdsize) { $line = <$f>; my ($gen, $vl, $vi, $vc, $vf, $vd, $uf, $tail) = $line =~ m#(\d+) (\d+) (\d+) (\d+) (\d+) (\d+) (\d+)(.*)$# or die "invalid content for sd at line $_ of $sdsize:\n$line\n"; $tail =~ m#(?: \d+){$vl}(?: \d+){$vi}(?: .){$vc}(?: [\d\.\-]){$vf}(?: [\d\.\-]+){$vd}$# or die "invalid tail for sd at line $_ of $sdsize:\n$tail\n"; } $line = <$f>; die "trailing stuff" if (defined($line));