我希望在Perl程序中作为CGI脚本的一部分执行
ls
。我使用了exec(ls)
,但这不会从exec
调用返回。
有没有更好的方法来获取Perl中目录的列表?
Exec不会返回任何内容。如果你需要返回内容,可以使用system。
如果你只想读取一个目录,可以使用open/read/close-dir。
opendir my($dh), $dirname or die "Couldn't open dir '$dirname': $!";
my @files = readdir $dh;
closedir $dh;
#print files...
.
和 ..
(代表当前目录和父目录),那么你需要使用以下代码:my @files = grep { !/^\.\.?$/ } readdir $dh;
。 - Platinum Azure其他人似乎都卡在 exec
部分的问题上。
如果您想要一个目录列表,请使用 Perl 内置的 glob
或 opendir
。 您不需要单独的进程。
exec 不会将控制权交还给perl程序。 system 会,但它不会返回ls的结果,而是返回一个状态码。 反引号 `` 将给出命令的输出,但被一些人认为是不安全的。
使用内置的目录函数。 opendir、readdir等等。
使用Perl通配符:
my $dir = </dir/path/*>
chdir $dir or die "Cannot chroot to $dir: $!\n";
my @files = glob("*.txt");
$listing = `ls`;
然而,Perl在处理自身的目录方面表现很好。我建议使用File::Find::Rule。
编辑:糟糕!我以为你只是想要列出目录...删除“directory”调用,使此脚本按照你的要求执行...
在我看来,玩弄文件句柄是错误的方法。以下是使用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);
在Linux上,我更喜欢使用find命令:
my @files = map { chomp; $_ } `find`;
find $theDir -maxdepth 1 -type f -mtime -2
; - Michael Rush