我认为这太复杂了。我需要一个脚本,将所有顶级目录和文件(在当前工作目录中)存储到一个数组中。
这就是我所拥有的:
#!/usr/bin/perl
use strict;
use warnings;
my $dir = 'C:\tmp';
my @names = ();
opendir(DIR, $dir) or die $!;
while (my $file = readdir(DIR)) {
next if ($file =~ m/^\./);
$file = "$file"." ";
# print "$file";
@names = split( /\s+/,$file);
foreach my $slot (@names) {
$slot = "$slot"." ";
}
print @names;
}
closedir(DIR);
exit 0;
虽然这很有效,但我知道这非常草率,而且我过于复杂,但我想不出任何可以让我更容易的事情。我试图避免使用任何非常基本的perl模块(File :: Find没问题,但是没有任何cnet模块)。所以我的问题是,我该如何简化呢?感谢
答案 0 :(得分:0)
这可能就是你想要的,
my @names = grep !/^[.]{1,2}$/, readdir(DIR);
你的循环可以简化为
while (my $file = readdir(DIR)) {
next if $file =~ /^\./;
$file =~ s/\s+/ /g;
$file .= " ";
print $file;
}
如果这有道理吗?
答案 1 :(得分:0)
您可以像这样使用File :: Slurp库:
#!/usr/bin/perl
use File::Slurp;
my @files = read_dir('C:\tmp');
答案 2 :(得分:0)
你误解了什么,但我不太确定是什么。在$file
中只有一个文件名,在分割空格之前添加空格是没有意义的
您的数组@names
将包含以空格分隔的文件名,如果它包含任何空格,否则它将只是原始文件名
然后你在@names
的每个元素的末尾加上空格,大概是为了替换split
删除的那些元素,所以我想知道你为什么首先使用split
最后,print @names
将打印重新组装的文件名,并在末尾添加一个空格。请注意,如果原始文件名中有多个空格,则现在将缩小为单个空格
打印由空格分隔的字符串数组的最简单方法是插入它为双引号字符串
此程序执行您的要求,但保留原始文件名。它使用grep
仅将那些不以点@names
开头的文件名放入.
。它还使用 lexical 目录句柄,这是现代最佳实践
use strict;
use warnings;
my $dir = 'C:\tmp';
opendir my $dh, $dir or die $!;
my @names = grep /^[^.]/, readdir $dh;
print "@names\n";