note
naikonta
The two subroutines in the code below achieve the same thing in different way. As others have pointed out, the mode <c>+<</c> (or <c>O_RDWR</c> with [mod://Fcntl] module) is the one you need instead of <c>+>></c> (the latter is still possible, just harder) for the first sub. The second sub uses [mod://Tie::File] module that makes file operation is as simple as array operation.
<p>The code (file locking is omitted intentionally):
<code>
#!/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;
}
</code>
<p>The run:
<code>
$ 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
</code>
<div class="pmsig"><div class="pmsig-607636">
<hr size="1" noshade="1">
<p align="right"><small>
<i>Open source softwares? Share and enjoy. Make profit from them if you can. Yet, share and enjoy!</i></small></p>
</div></div>
652593
652593