读取增量然后写入perl中的文本文件

时间:2013-03-23 04:29:26

标签: perl file-io increment

我有这个小的perl脚本打开一个txt文件,读取其中的数字,然后用数字增加1覆盖文件。我可以打开并从文件中读取,我可以写入文件但是我&# 34; m有覆盖问题。另外,我想知道是否有办法在不打开文件两次的情况下执行此操作。这是我的代码:

#!/usr/bin/perl

open (FILE, "<", "data.txt") or die "$! error trying to a\
ppend";

 undef $/;

$number = <FILE>;
$number = int($number);
$myNumber = $number++;
print $myNumber+'\n';
close(FILE);

open(FILE, ">data.txt") or die "$! error";
print FILE $myNumber;
close(FILE);

3 个答案:

答案 0 :(得分:3)

更改行

$myNumber = $number++;
to 
$myNumber = $number+1;

那应该可以解决问题。

以下是打开文件一次的方法:

 open(FILE, "+<data.txt") or die "$! error";
 undef $/; 

 $number = <FILE>;
 $number = int($number);
 $myNumber = $number+1;
 seek(FILE, 0, 0); 
 truncate(FILE, tell FILE);
 print $myNumber+"\n";

 print FILE $myNumber;
 close(FILE);

答案 1 :(得分:3)

第一次使用open的三参数形式是件好事。您还需要在第二个open中执行此操作。此外,您应该在脚本中使用词法变量,即以my开头的变量 - 甚至是文件句柄。

您可以只增加保存数字的变量,而不是将其传递给新变量。此外,使用chomp是个好主意。这就是说,请考虑以下选项:

#!/usr/bin/env perl

use strict;
use warnings;

undef $/;

open my $fhIN, "<", "data.txt" or die "Error trying to open for reading: $!";
chomp( my $number = <$fhIN> );
close $fhIN;

$number++;

open my $fhOUT, ">", "data.txt" or die "Error trying to open for writing: $!";
print $fhOUT $number;
close $fhOUT;

另一种选择是使用模块File::Slurp,让它处理所有I / O操作:

#!/usr/bin/env perl
use strict;
use warnings;
use File::Slurp qw/edit_file/;

edit_file { chomp; $_++ } 'data.txt';

答案 2 :(得分:0)

试试这个:

#!/usr/bin/perl
use strict;
use warnings;
my $file = "data.txt";
my $number = 0;
my $fh;
if( -e $file ) {
    open $fh, "+<", $file or die "Opening '$file' failed, because $!\n";
    $number = <$fh>;
    seek( $fh, 0, 0 );
} else {                  # if no data.txt exists - yet
    open $fh, ">", $file or die "Creating '$file' failed, because $!\n";
}
$number++;
print "$number\n";
print $fh $number;
close( $fh );

如果您正在使用bash shell,并将代码保存到test.pl,则可以使用以下命令进行测试:

for i in {1..10}; do ./test.pl; done

然后'cat data.txt'应显示10。