2009-10-14 47 views
3

我正在编写一个脚本,查找目录中的某些文件并处理它们。我一直在写以下内容:如何用一条语句在Perl中读取一个目录?

opendir DIR, $dir; 
@files = readdir DIR; 
closedir DIR; 

虽然我可能(事实上应该)在一个函数把这个包,我想知道是否有一个更优雅的方式来做到这一点?

+0

你可能想看看这个问题的答案:http://stackoverflow.com/questions/ 1506801/what-reasons-there-to-prefer-glob-over-readdir-or-vice-versa-in-perl – innaM 2009-10-14 11:21:04

+1

你是什么意思“写一个目录”? – 2009-10-14 12:18:07

+0

其实我的意思是“写下面的代码*” – 2009-10-14 12:52:22

回答

14

最优雅的是使用其他人已经写好的功能。

use File::Slurp; 

@files = read_dir $dir; # . and .. are removed by default 
1

我喜欢使用File::Find这种东西。

+1

为什么你想要做一个深度优先搜索从一个目录中获取文件列表? – 2009-10-15 00:56:08

5

另一种方法是使用do块:

my @files = do { 
    opendir my $d, '/your/dir/'; 
    readdir $d; 
}; 

它更优雅,因为我的$ d是局部阻塞(不像你的DIR全局)不需要和closedir,因为文件句柄$ d超出范围时自动关闭。

/I3az/

0

没人说得清glob了吗? OK,这里有云:

@files = glob("$dir/*"); 

或者,如果你需要以点开始,也文件:

@files = glob("$dir/{.,}*") 
0

水珠是最简单的解决方案。我不知道你认为前面三行代码属于哪个子程序,除非你打开这个文件不止一次