You are correct on both points, although I didn't intentionally hide anything - most of the data I work with day to day is plain ASCII, so I just missed the encoding issue (and Tie::File creates nonexistent files and I was testing in /tmp - but without or die it fails silently on e.g. permission denied, so that's not an excuse).
use Tie::File;
use Fcntl qw/O_RDWR/;
tie my @a, 'Tie::File', $file, mode=>O_RDWR or die $!;
# but doesn't handle encodings
# - or -
use Tie::File;
open my $fh, '+<:encoding(UTF-8)', $file or die $!;
tie my @a, 'Tie::File', $fh or die $!;
Better examples, I hope. Thanks for setting me straight.