in reply to open file or pipe ?

Your use of sysread is rather buggy. It can make it impossible to decode what you encoded, because sysread can return any number of bytes for any given call. This is rather moot, since we don't need to sysread from the temporary file at all.

use strict; use warnings; sub getcryptkey { return 'ABCDEFGHIJK'; } { ##### WRITER ##### my @records = ( [ 0, 1, 2 ], [ 3, 4, 5 ], [ 6, 7, 8 ], ); my $newenckey = getcryptkey(); local *PASSF; open(PASSF, ">$ENV{HOME}/.perlpasswd") or die("Can't write $ENV{HOME}/.perlpasswd: $!\n"); binmode(PASSF); my $buf = ''; foreach (@records) { # Might want to use FreezeThaw instead. $buf .= "$_->[0] $_->[1] $_->[2]\n"; print PASSF substr($buf, 0, length($newenckey), '') ^ $newenckey while (length($buf) >= length($newenckey)); } print PASSF $buf ^ substr($newenckey, 0, length($buf)); close(PASSF); } { ##### READER ##### my @records; my $newenckey = getcryptkey(); local *PASSF; open(PASSF, "<$ENV{HOME}/.perlpasswd") or die("Can't read $ENV{HOME}/.perlpasswd: $!\n"); binmode(PASSF); my $buf_e = ''; my $buf_d = ''; my $BLOCK_SIZE = length($newenckey); # Can be anything. while (sysread(PASSF, $buf_e, $BLOCK_SIZE, length($buf_e))) { $buf_d .= substr($buf_e, 0, length($newenckey), '') ^ $newenckey while (length($buf_e) >= length($newenckey)); push(@records, [ $1, $2, $3 ]) while ($buf_d =~ s/^(\S+)\s+(\S+)\s+(\S+)\n//s); } $buf_d .= $buf_e ^ substr($newenckey, 0, length($buf_e)); push(@records, [ $1, $2, $3 ]) while ($buf_d =~ s/^(\S+)\s+(\S+)\s+(\S+)\n//s); close(PASSF); require Data::Dumper; print(Data::Dumper::Dumper(\@records)); } __END__ ##### OUTPUT ##### $VAR1 = [ [ '0', '1', '2' ], [ '3', '4', '5' ], [ '6', '7', '8' ] ];

sysread and syswrite are properly used (except I don't check for errors), and the key is used from start to end.