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
####
c:\@Work\Perl\monks\syedasadali95>perl write_to_2_files_1.pl file_in.txt zero.txt one.txt
####
1. command:read address:0xA
7. command:read address:0xC
####
2. command:write address:0xB
3. writedata:0x12
4. writedata:0x34
5. writedata:0x56
6. writedata:0x78
8. command:write address:0xD
9. writedata:0x9A
10. writedata:0xBC
11. writedata:0xDE
12. writedata:0xF0