Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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_List_Directory - Fatal编程技术网

如何获取Perl中的目录列表?

如何获取Perl中的目录列表?,perl,list,directory,Perl,List,Directory,我想在Perl程序中执行ls,作为CGI脚本的一部分。为此,我使用了exec(ls),但这不会从exec调用返回 有没有更好的方法在Perl中获取目录列表?为了获得系统命令的输出,需要使用backticks $listing = `ls`; 然而,Perl本身在处理目录方面很好。我建议使用File::Find::Rule。Exec根本不会返回。如果您需要,请使用系统 如果您只想读取目录,则open/read/closedir可能更合适 opendir my($dh), $dirname or

我想在Perl程序中执行
ls
,作为CGI脚本的一部分。为此,我使用了
exec(ls)
,但这不会从
exec
调用返回


有没有更好的方法在Perl中获取目录列表?

为了获得系统命令的输出,需要使用backticks

$listing = `ls`;

然而,Perl本身在处理目录方面很好。我建议使用File::Find::Rule。

Exec根本不会返回。如果您需要,请使用系统

如果您只想读取目录,则open/read/closedir可能更合适

opendir my($dh), $dirname or die "Couldn't open dir '$dirname': $!";
my @files = readdir $dh;
closedir $dh;
#print files...

exec不会将控制权返还给perl程序。 系统将返回,但它不会返回ls的结果,而是返回状态代码。 勾号将为您提供我们命令的输出,但被一些人认为是不安全的

使用内置的dir函数。 opendir、readdir等等


我建议您看看。它比系统或回执更能控制生成的进程。

其他人似乎都被问题的执行部分卡住了


如果需要目录列表,请使用Perl内置的
glob
opendir
。您不需要单独的进程。

在Linux上,我更喜欢查找:

my @files = map { chomp; $_ } `find`;
还有一个例子:

chdir $dir or die "Cannot chroot to $dir: $!\n";
my @files = glob("*.txt");

编辑:哇!我以为你只是想要一个目录列表。。。删除“目录”调用以使此脚本执行您希望它执行的操作

在我看来,使用文件句柄是错误的做法。下面是使用File::Find::Rule查找指定目录中所有目录的示例。对于你正在做的事情来说,这似乎是杀伤力过大,但后来,这可能是值得的

首先,我的单线解决方案:

File::Find::Rule->maxdepth(1)->directory->in($base_dir);
现在是一个带有注释的更冗长的版本。如果您安装了File::Find::Rule,您应该能够运行此操作,没有问题。不要害怕CPAN

#!/usr/bin/perl

use strict;
use warnings;

# See http://search.cpan.org/~rclamp/File-Find-Rule-0.32/README
use File::Find::Rule;

# If a base directory was not past to the script, assume current working director
my $base_dir = shift // '.';
my $find_rule = File::Find::Rule->new;

# Do not descend past the first level
$find_rule->maxdepth(1);

# Only return directories
$find_rule->directory;

# Apply the rule and retrieve the subdirectories
my @sub_dirs = $find_rule->in($base_dir);

# Print out the name of each directory on its own line
print join("\n", @sub_dirs);
使用Perl Globbing:

my $dir = </dir/path/*> 
my$dir=

检查系统命令的返回值:opendir。。。或者死“…$!”或“使用autodie;”使它们在默认情况下致命。我知道这只是吹毛求疵,但当你给初学者提供建议时,这对他们来说是一个重要的教训。如果有人想知道为什么没有检查readdir和closedir:两者都只有一个可能的错误,“无效的目录句柄”。由于我自己打开并检查了它,我可以放心地认为它是有效的。此外,在列表上下文中,也无法检查readddir。如果您不想要点文件,可以执行以下操作:my@files=grep{!/^\./}readdir$dh;如果您想要以点开头的文件,而不是
.
(对于当前目录和父目录),那么您需要:
my@files=grep{!/^\.\?$/}readdir$dh
。具体来说,glob完全可以执行您想要的操作:返回文件夹中文件名的数组。如果您不仅列出目录,而且希望查找具有某些条件的文件,则此操作尤其有用。比如说,您希望在过去两天内修改文件:my@recentFiles=map{chomp;$}
find$theDir-maxdepth 1-type f-mtime-2
+1作为文件::查找::规则是rockingsystem(“ls”);我会那样做的。