所以我有一个程序,我想清理一些文本文件。该程序要求用户输入包含这些文本文件的目录的完整路径。从那里我想读取目录中的文件,将它们打印到一个新文件(由用户指定),然后以我需要的方式清理它们。我已经编写了脚本来清理文本文件。
我要求用户输入目录:
chomp ($user_supplied_directory = <STDIN>);
opendir (DIR, $user_supplied_directory);
然后我需要阅读目录。
my @dir = readdir DIR;
foreach (@dir) {
现在我迷路了。
请帮忙吗?
答案 0 :(得分:2)
我不确定你想要什么。所以,我做了一些假设:
所以,如果我是对的,试试这样的事情:
chomp ($user_supplied_directory = <STDIN>);
opendir (DIR, $user_supplied_directory);
my @dir = readdir DIR;
foreach (@dir) {
next if (($_ eq '.') || ($_ eq '..'));
# Reads the content of the original file
open FILE, $_;
$contents = <FILE>;
close FILE;
# Here you supply the new filename
$new_filename = $_ . ".new";
# Writes the content to the new file
open FILE, '>'.$new_filename;
print FILE $content;
close FILE;
# Deletes the old file
unlink $_;
}
答案 1 :(得分:1)
我建议您切换到File :: Find。它在一开始可能是一个挑战,但它是强大的跨平台。
但是,要回答你的问题,请尝试以下方法:
my @files = readdir DIR;
foreach $file (@files) {
foo($user_supplied_directory/$file);
}
其中“foo”是您需要对文件执行的操作。一些注释可能有所帮助:
grep
删除不需要的文件和子文件夹可能会很方便,特别是“..”答案 2 :(得分:1)
今天我写了一些使用readdir
的内容。也许你可以从中学到一些东西。这只是(某种程度上)更大程序的一部分:
our @Perls = ();
{
my $perl_rx = qr { ^ perl [\d.] + $ }x;
for my $dir (split(/:/, $ENV{PATH})) {
### scanning: $dir
my $relative = ($dir =~ m{^/});
my $dirpath = $relative ? $dir : "$cwd/$dir";
unless (chdir($dirpath)) {
warn "can't cd to $dirpath: $!\n";
next;
}
opendir(my $dot, ".") || next;
while ($_ = readdir($dot)) {
next unless /$perl_rx/o;
### considering: $_
next unless -f;
next unless -x _;
### saving: $_
push @Perls, "$dir/$_";
}
}
}
{
my $two_dots = qr{ [.] .* [.] }x;
if (grep /$two_dots/, @Perls) {
@Perls = grep /$two_dots/, @Perls;
}
}
{
my (%seen, $dev, $ino);
@Perls = grep {
($dev, $ino) = stat $_;
! $seen{$dev, $ino}++;
} @Perls;
}
症结是push(@Perls, "$dir/$_")
:readdir
读取的文件名只是基本名称;它们不是完整的路径名。
答案 3 :(得分:0)
您可以执行以下操作,以允许用户提供自己的目录,或者,如果用户未指定目录,则默认为指定位置。
该示例显示了opendir
,readdir
的用法,将所有文件存储在@files
数组的目录中,而在{{中仅以'.txt'结尾的文件1}}数组。 while循环可确保将文件的完整路径存储在数组中。
这假定您的“文本文件”以“ .txt”后缀结尾。我希望能有所帮助,因为我不太确定“清理文件”的含义。
@keys
有关更多信息,请参见perldoc of File::Copy。