http://www.perlmonks.org?node_id=652607


in reply to Filehandles vs Uninitialized Values in pattern match

The two subroutines in the code below achieve the same thing in different way. As others have pointed out, the mode +< (or O_RDWR with Fcntl module) is the one you need instead of +>> (the latter is still possible, just harder) for the first sub. The second sub uses Tie::File module that makes file operation is as simple as array operation.

The code (file locking is omitted intentionally):

#!/usr/bin/perl use strict; use warnings; my($rdwr_file, $tie_file) = @ARGV; with_rdwr(); with_tiefile(); sub with_rdwr { open DAT, "+<$rdwr_file" or die "can't open $rdwr_file: $!\n"; my $last = (<DAT>)[-1]; if ($last =~ /(\d+)/) { my $new = $1 + 1; seek DAT, 0, 2 or die "Can't seek in $rdwr_file: $!\n"; print DAT $new, "\n"; print "new value for $rdwr_file: $new\n"; } close DAT; } sub with_tiefile { use Tie::File; my @lines; tie @lines, 'Tie::File', $tie_file or die "can't tie $tie_file: $! +\n"; my $last = $lines[-1]; if ($last =~ /(\d+)/) { # sure, testing on $lines[-1] saves a line my $new = $1 + 1; push @lines, $new; print "new value for $tie_file: $new\n"; } untie @lines; }

The run:

$ echo 0 > rdwr $ echo 0 > tie $ cat rdwr 0 $ cat tie 0 $ perl prog.pl rdwr tie new value for rdwr: 1 new value for tie: 1 $ cat rdwr 0 1 $ cat tie 0 1 ... and some executions later.. $ cat rdwr 0 1 2 3 4 5 $ cat tie 0 1 2 3 4 5

Open source softwares? Share and enjoy. Make profit from them if you can. Yet, share and enjoy!