我有一个文件tmp.txt
,它只包含一个整数0
。
我需要读取此文件并将其递增1。
open (my $tmp, '+<', $tmp_file) or die "failed to open";
flock($tmp, LOCK_EX);
$t_int = int(<$tmp>);
$t_count = $t_int + 1;
print "***********t_count in file $t_int , $t_count**********\n";
print $tmp $t_count;
print "===========t_count in file $t_int , $t_count==========\n";
close($tmp) or die "failed to close";
我得到如下输出:
第一次运行脚本:
***********t_count in file 0 , 1**********
===========t_count in file 0 , 1==========
第二次:
***********t_count in file 1 , 2**********
===========t_count in file 1 , 2==========
第三次:
***********t_count in file 12 , 13**********
===========t_count in file 12 , 13==========
第四次:
***********t_count in file 1213 , 1214**********
===========t_count in file 1213 , 1214==========
第五次:
***********t_count in file 12131214 , 12131215**********
===========t_count in file 12131214 , 12131215==========
依旧......
我不明白为什么它将之前的数字与结果联系起来。为什么这个脚本不正确?
答案 0 :(得分:4)
seek()
允许您在文件句柄中移动位置。
seek($fh, 0, SEEK_SET)
表示移动到距文件开头零字节的位置。您必须从Fcntl
。
#!/usr/bin/perl
use strict;
use warnings;
use Fcntl qw/ LOCK_EX SEEK_SET /;
my $tmp_file = 'test.dat';
open (my $tmp, '+<', $tmp_file) or die $!;
flock($tmp, LOCK_EX);
my $t_int = (int(<$tmp>));
my $t_count = $t_int + 1;
seek ($tmp, 0, SEEK_SET);
print $tmp $t_count;
close $tmp or die $!;
__END__
答案 1 :(得分:2)
在打印到文件之前,您需要使用seek返回文件的开头。在打印之前尝试添加此内容:
seek($tmp,0,0);
答案 2 :(得分:2)
使用核心模块Tie::File
这是一个如何运作的例子
use Tie::File;
use Fcntl 'LOCK_EX';
my $tmp_file = 'inc.txt';
{
my $tied = tie my @file, 'Tie::File', $tmp_file or die $!;
$tied->flock(LOCK_EX);
++$file[0];
}
由于flock
我认为这是使用Parallel::ForkManager
这样的并行运行。该程序显示了如何使用三十个并行进程将文件中的数字增加1,000次
use strict;
use warnings;
use Tie::File;
use Fcntl 'LOCK_EX';
use Parallel::ForkManager;
my $tmp_file = 'inc.txt';
my $pm = Parallel::ForkManager->new(30);
for (1 .. 1000) {
next if $pm->start;
{
my $tied = tie my @file, 'Tie::File', $tmp_file or die $!;
$tied->flock(LOCK_EX);
++$file[0];
}
$pm->finish;
}
$pm->wait_all_children;