Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Perl列出目录中的所有文件?_Perl_Directory - Fatal编程技术网

如何使用Perl列出目录中的所有文件?

如何使用Perl列出目录中的所有文件?,perl,directory,Perl,Directory,我通常使用类似 my $dir="/path/to/dir"; opendir(DIR, $dir) or die "can't open $dir: $!"; my @files = readdir DIR; closedir DIR; 或者有时我使用glob,但无论如何,我总是需要添加一两行来过滤和。这很烦人。 你通常是如何完成这项普通任务的 my @files = grep {!/^\./} readdir DIR; 这也将排除所有的点文件,但这通常是您想要的。如果某些点文件很重要 m

我通常使用类似

my $dir="/path/to/dir";
opendir(DIR, $dir) or die "can't open $dir: $!";
my @files = readdir DIR;
closedir DIR;
或者有时我使用
glob
,但无论如何,我总是需要添加一两行来过滤
这很烦人。 你通常是如何完成这项普通任务的

my @files = grep {!/^\./} readdir DIR;

这也将排除所有的点文件,但这通常是您想要的。

如果某些点文件很重要

my @files = grep !/^\.\.?$/, readdir DIR;

将仅排除

我通常使用
全局方法:

for my $file (glob "$dir/*") {
    #do stuff with $file
}
除非目录中有很多文件,否则这种方法可以正常工作。在这些情况下,您必须在
循环中切换回
readdir
(将
readdir
放入列表上下文与
glob
一样糟糕):

但通常,如果我正在读取目录中的一组文件,我希望以递归方式读取它们。在这些情况下,我使用
File::Find

use File::Find;

find sub {
    return if /^[.]/;
    #do stuff with $_ or $File::Find::name
}, $dir;

当我只需要文件(而不是目录)时,我使用
grep
-f
测试:

my @files = grep { -f } readdir $dir;
我经常使用。好处包括:(1)如果目录不存在,则自动死亡。(2) 默认情况下排除
。它的行为类似于
readdir
,因为它不返回完整路径

use File::Slurp qw(read_dir);

my $dir = '/path/to/dir';
my @contents = read_dir($dir);
另一个有用的模块是,它在读取目录时提供了许多选项。例如:

use File::Util;
my $dir = '/path/to/dir';
my $fu = File::Util->new;
my @contents = $fu->list_dir( $dir, '--with-paths', '--no-fsdots' );

谢谢克里斯和埃瑟的推荐。我使用以下命令将所有文件(排除的目录)的列表从引用当前目录以外的目录的目录句柄读取到数组中。当不使用grep语句中的绝对路径时,数组总是缺少一个文件

use File::Slurp; 

print "\nWhich folder do you want to replace text? " ;
chomp (my $input = <>);
if ($input eq "") {
print "\nNo folder entered exiting program!!!\n";
exit 0;
} 

opendir(my $dh, $input) or die "\nUnable to access directory $input!!!\n"; 

my @dir = grep { -f "$input\\$_" } readdir $dh;
使用File::Slurp;
打印“\n要替换哪个文件夹的文本?”;
chomp(我的$input=);
如果($input eq“”){
打印“\n没有文件夹进入退出程序!!!\n”;
出口0;
} 
opendir(我的$dh,$input)或die“\n无法访问目录$input!!!\n”;
my@dir=grep{-f“$input\\\$\”readdir$dh;

从大量的响应中,您可以看到这完全取决于您想要得到什么结果。:)的可能重复。这仅在目录句柄用于当前目录时才起作用。@Chris:好的,首先需要chdir,或者在grep中使用
File::Spec->catfile($dirname,$\ux)构造一个绝对路径名
…这不是OP的要求。他只想过滤掉
。很好。我可以让它返回完整的路径(不是基本名称)吗?@ David B You也可以考虑<代码>文件::Util < />代码,如编辑的答案所示。并不是说我希望那个文件名出现在任何人身上,而是人们会做一些奇怪的事情,看看是否有人会忽略他们偷偷溜进你的目录中的一个文件。你可以用一个\z而不是$:)来解决这个问题。
[.]
的用法很奇怪---为什么你更喜欢它而不是
\.
?@Chris Jester Young我更喜欢它。它似乎没有那么吵(见)。同样,这也是合理化的,正则表达式中的转义往往意味着“下一个字符做了一些特殊的事情”(例如,
\x{2e}
),但
\.
意味着它只是一个句点。由于大多数字符在字符类中没有特殊意义,因此它是一种很好的转义机制。
use File::Slurp; 

print "\nWhich folder do you want to replace text? " ;
chomp (my $input = <>);
if ($input eq "") {
print "\nNo folder entered exiting program!!!\n";
exit 0;
} 

opendir(my $dh, $input) or die "\nUnable to access directory $input!!!\n"; 

my @dir = grep { -f "$input\\$_" } readdir $dh;