1

我有这个小 perl 脚本,它打开一个 txt 文件,读取其中的数字,然后用递增 1 的数字覆盖文件。我可以打开和读取文件,我可以写入文件,但我有问题覆盖。此外,我想知道是否有办法在不打开文件两次的情况下做到这一点。这是我的代码:

#!/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);
4

3 回答 3

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;

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

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

edit_file { chomp; $_++ } 'data.txt';
于 2013-03-23T05:12:57.937 回答
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);
于 2013-03-23T04:38:44.257 回答
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。

于 2013-03-23T05:33:53.693 回答