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; } }