use strict; use warnings; use constant USAGE => <<"EOT"; usage: perl $0 file_in file_zero file_one where: file_in input file name file_zero output file name - address[0] bit == 0 file_one output file name - address[0] bit == 1 EOT die USAGE if @ARGV != 3; my ($file_in, $file_zero, $file_one) = @ARGV; open my $fh_in, '<', $file_in or die "opening '$file_in': $!"; open my $fh_0, '>', $file_zero or die "opening '$file_zero': $!"; open my $fh_1, '>', $file_one or die "opening '$file_one': $!"; my $fh_current; LINE: while (my $line = <$fh_in>) { next LINE unless $line =~ m{ \S }xms; # ignore blank lines my $got_command_addr = my ($rw_hex_addr) = $line =~ m{ \A \d+ [.] \s+ command: (?: read | write) \s+ address:0x ([[:xdigit:]]+) \s* \Z }xms; if ($got_command_addr) { $fh_current = 0x1 & hex $rw_hex_addr ? $fh_1 : $fh_0; } die "no command read/write address seen" unless $fh_current; print $fh_current $line; } close $fh_in or die "closing '$file_in': $!"; close $fh_0 or die "closing '$file_zero': $!"; close $fh_1 or die "closing '$file_one': $!"; exit; # subroutines ###################################################### # none for now