我想打开一个 data(n).txt 文件(在已经存在 data(n).txt 文件的目录中,例如:data0001.txt、data0002.txt、data0003.txt)。
在这个(新)文件中打印一些数据后,我想用连续的文件编号存储这个新文件(在本例中:data0004.txt)。
我是初学者,对 Perl 不太了解。
此代码仅创建 data0001.txt 文件并覆盖其内容:
#!/usr/bin/perl
open (DATEI, ">>data0001.txt") or die $!;
print DATEI "this is a test";
close (DATEI);
为了按照描述的方式命名文件,其数字比现有文件名中的最大数字大一,我们需要首先读取目录并找出文件名中的最大数字是多少。然后我们可以编写新文件,使用
sprintf
将数字格式化为文件名中的四字符字符串
一种方法来做到这一点
use warnings;
use strict;
use feature 'say';
use FindBin qw($RealBin);
use List::Util qw(max);
# Submit directory on the command line or use the one where this script is
my $dir = shift // $RealBin;
my @files = glob "$dir/data*txt";
my $max_num = max map { /data([0-9]{4})\.txt/ } @files;
my $next_file_name = 'data' . sprintf("%04d", $max_num+1) . '.txt';
open my $fh, '>', $next_file_name or die "Can't open $next_file_name: $!";
say $fh "Writing to the next file $next_file_name";
close $fh or warn "Error writing to $next_file_name: $!"
这是一个草图,可以根据您的要求将其加工成更全面、更灵活的程序。
文档,大多按出现顺序排列:FindBin、List::Util::max、glob、map、perlretut(正则表达式“教程”介绍)、sprintf、open , 关闭。
当我使用
glob
从目录中读取条目时,请考虑使用 加载 File::Glob
use File::Glob ':bsd_glob';
然后对于
glob
,使用此模块中的例程,这有一些优点。
问题代码中使用的模式
>>
用于打开文件进行追加(并且不会覆盖)。但由于描述反复谈到编写“新文件”,我认为这就是问题所在。如果您确实想写入(追加)到现有文件,请参阅 open
了解 >>
的使用。
关于使用的工具的说明:此列表中的
map
和正则表达式是经常使用的圆形工具,并且 List::Util
库具有日常工作的基本实用程序。我建议充分熟悉他们。然而,正则表达式是一个庞大而复杂的工具,实际上它本身就是一种语言,需要时间才能学好。但即使它的基础知识也非常有用,没有它就很难工作。