我有这个小的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);
答案 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。