$ hexdump -C spw1006361.bin
00000000 00 00 01 00 02 00 03 00 04 00 05 00 06 00 07 00 |................|
00000010 08 00 09 00 0a 00 0b 00 0c 00 0d 00 0e 00 0f 00 |................|
00000020 10 00 11 00 12 00 13 00 14 00 15 00 16 00 17 00 |................|
00000030 18 00 19 00 1a 00 1b 00 1c 00 1d 00 1e 00 1f 00 |................|
00000040
$
####
use strict;
use warnings;
use 5.014;
use Fcntl qw{ :DEFAULT :seek };
use constant RECLEN => 2;
my $binFile = q{spw1006361.bin};
sysopen my $binFH, $binFile, O_RDWR
or die qq{sysopen: $binFile: $!\n};
my $origValue = readValue( $binFH, 7 );
say qq{Record 7 originally: $origValue};
writeValue( $binFH, 7, $origValue * 3 );
say qq{Record 7 now : @{ [ readValue( $binFH, 7 ) ] }};
close $binFH
or die qq{sysopen: $binFile: $!\n};
sub readValue
{
my( $fh, $recNo ) = @_;
sysseek $fh, $recNo * RECLEN, SEEK_SET
or die qq{sysseek: $!\n};
my $bytesRead = sysread $fh, my $buffer, RECLEN;
if ( not defined $bytesRead )
{
die qq{sysread: $!\n};
}
elsif ( $bytesRead == 0 )
{
die qq{sysread: EOF\n};
}
elsif ( $bytesRead != RECLEN )
{
die
qq{sysread: expected @{ [ RECLEN ] } bytes,},
qq{ got $bytesRead\n};
}
else
{
return unpack q{v}, $buffer;
}
}
sub writeValue
{
my( $fh, $recNo, $value ) = @_;
sysseek $fh, $recNo * RECLEN, SEEK_SET
or die qq{sysseek: $!\n};
my $bytesWritten = syswrite $fh, pack q{v}, $value;
if ( not defined $bytesWritten )
{
die qq{syswrite: $!\n};
}
elsif ( $bytesWritten != RECLEN )
{
die
qq{syswrite: expected @{ [ RECLEN ] } bytes,},
qq{ wrote $bytesWritten\n};
}
else
{
return;
}
}
####
]$ ./spw1006361
Record 7 originally: 7
Record 7 now : 21
$
####
]$ hexdump -C spw1006361.bin
00000000 00 00 01 00 02 00 03 00 04 00 05 00 06 00 15 00 |................|
00000010 08 00 09 00 0a 00 0b 00 0c 00 0d 00 0e 00 0f 00 |................|
00000020 10 00 11 00 12 00 13 00 14 00 15 00 16 00 17 00 |................|
00000030 18 00 19 00 1a 00 1b 00 1c 00 1d 00 1e 00 1f 00 |................|
00000040
$