如何编写一个脚本,以根据用户提供的参数来读取特定目录中的所有文件或特定目录中的一个文件?
我知道我可以使用以下命令打开目录中的所有文件:
opendir my $dh, $dir or die "Could not open '$dir' for reading: $!\n";
my @files = readdir($dh);
{
#Do something
}
closedir($dh);
我也知道我只能使用以下命令从目录中打开一个文件:
my $src = $ARGV[0];
open(SRC,'<',$src) or die $!;
{
#Do something
}
close(SRC);
是否有一种方法可以检测用户提供的参数,以便知道该参数是目录还是仅文件?如果是这样,如何实现?
答案 0 :(得分:4)
您可以使用-d
built-in检查某些内容是否是目录,或者使用-f
built-in检查该内容是否是文件。一个或另一个都可以,但是检查两者都比较安全,这样您就可以捕获两个都不输入的输入。
if ( -d $file_or_dir ) {
# it's a directory ...
}
elsif ( -f $file_or_directory ) {
# it's a file ...
else {
# it's bad input, so neither
}
命令行参数位于@ARGV
中。这是一个简单的数组,您可以从中读取。您可以轻松地将整个程序包装成一个循环,这样它就可以处理多个参数。
答案 1 :(得分:4)
是的,您可以使用file test operators来检查有关文件的内容。 -f
检查它是否为常规文件,-d
检查其是否为目录,其他检查其他内容。
use strict;
use warnings;
use autodie;
use v5.10;
my $arg = shift;
my @files;
if( -d $arg ) {
opendir my $dh, $arg;
@files = readdir $dh;
}
elsif( -f $arg ) {
push @files, $arg;
}
else {
die "$arg is neither a file nor directory";
}
不要忘记从.
中过滤掉..
和readdir
。考虑改用Path::Tiny。