以连续的文件编号存储文件

问题描述 投票:0回答:1

我想打开一个 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);
perl
1个回答
3
投票

为了按照描述的方式命名文件,其数字比现有文件名中的最大数字大一,我们需要首先读取目录并找出文件名中的最大数字是多少。然后我们可以编写新文件,使用

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: $!"

这是一个草图,可以根据您的要求将其加工成更全面、更灵活的程序。

文档,大多按出现顺序排列:FindBinList::Util::maxglobmapperlretut(正则表达式“教程”介绍)、sprintfopen , 关闭

当我使用

glob
从目录中读取条目时,请考虑使用 加载 File::Glob

use File::Glob ':bsd_glob';

然后对于

glob
,使用此模块中的例程,这有一些优点。

问题代码中使用的模式

>>
用于打开文件进行追加(并且不会覆盖)。但由于描述反复谈到编写“新文件”,我认为这就是问题所在。如果您确实想写入(追加)到现有文件,请参阅
open
了解
>>
的使用。


关于使用的工具的说明:此列表中的

map
和正则表达式是经常使用的圆形工具,并且
List::Util
库具有日常工作的基本实用程序。我建议充分熟悉他们。然而,正则表达式是一个庞大而复杂的工具,实际上它本身就是一种语言,需要时间才能学好。但即使它的基础知识也非常有用,没有它就很难工作。

© www.soinside.com 2019 - 2024. All rights reserved.