递增存储在文件中的整数:Perl

时间:2015-08-01 03:54:49

标签: perl

我有一个文件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==========

依旧......

我不明白为什么它将之前的数字与结果联系起来。为什么这个脚本不正确?

3 个答案:

答案 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;