我编写的程序逐行遍历目录和子目录中的所有文件,并执行一些命令include $ counter。 我想制作一个.txt文件,每一行都是这样的:
<file name> <$counter in the beginning of the file>
例如,如果我在文件中有三个文件a.txt,b.txt和c.txt,则计数器在文件b中计数10,它计数为20,在文件c中,它计数为30,文件将如下所示:
a.txt 0
b.txt 10
c.txt 20
我的程序如下:
use strict;
use warnings;
use File::Find;
my $dir = "C:/New Folder";
open (MYFILE, '>>data.txt');
# fill up our argument list with file names:
find(sub { if (-f && /\.[c]$/) { push @ARGV, $File::Find::name } }, $dir);
$^I = ".bak"; # supply backup string to enable in-place edit
foreach $argvv(@ARGV)
{
while (<>)
{
if ($prev_arg ne $argvv)
{
print MYFILE "$argvv $counter\n";
$prev_arg = $argvv;
}
#some unrelated line by line code here
close (MYFILE);
}
}
我试图做的是让程序在每次完成文件并打开另一个文件时打印文件名和计数器。
我得到的data.txt文件是第一个文件的名称和为目录中每个文件的每一行打印的计数器。 毋庸置疑,我在Perl中是一个完全的菜鸟,所以我真的很感激一些帮助。
谢谢:)
答案 0 :(得分:0)
您的代码存在一些问题。
strict
和warnings
,但尚未声明$prev_arg
和$argvv
。警告告诉了你他们。-i
命令行开关和参数列表来从STDIN
读取。这对我来说都没有意义。相反,您应该使用普通数组并逐个打开文件。open
的双参数形式。相反,请使用词法文件句柄,因为它们不是全局的,而只存在于它们的周围块中。使用open
的三参数形式,这样您就不会遇到安全问题。见here。试试这个:
use warnings;
use strict;
use File::Find;
my $dir = 'D:/temp';
my @files;
find(
sub {
if (-f && /\.c.txt$/) {
push @files, $File::Find::name }
},
$dir
);
open my $fh_out, '>>', 'data.txt' # open the output filehandle
or die $!;
foreach my $file (@files) { # iterate the file list
open my $fh_in, '<', $file # open the current file for reading
or die $!;
my $counter = <$fh_in>; # read the first line
chomp $counter; # remove trailing linebreak
close $fh_in;
print $fh_out "$file $counter\n"; # close the input filehandle (explicit)
}
close $fh_out; # close the output filehandle