访问perl中的Default目录



我有一个perl脚本,它以目录路径为输入,然后脚本遍历该目录中的所有文件。对于每个文件,它调用一些其他函数。

这是脚本:

#!/usr/bin/perl
use JSON;   
use XML::Simple;
use File::Spec;
$num_args = $#ARGV + 1;
if ($num_args != 1) {
    print "nUsage: $0 <input directory>n";
    exit;
}
my $dir = $ARGV[0];
opendir(DIR, $dir) or die "cannot open directory";
@docs = grep(/.xml$/,readdir(DIR));
foreach $file (@docs) 
{
    my $abs_path = join("",$dir,$file);
    #print $abs_path;
    my $return_object = some_function_call($abs_path);
    print_output($return_object);
 }
 sub print_output
 {
    my $output_object = $_[0];
    print $output_object;
 }

我在这里的问题是,当我读取输入目录时,如果不存在,如何使上面的脚本从"某个默认目录位置"读取。我试着添加一些逻辑,但对我来说不起作用。这是我的第一个perl脚本,所以如果这太基本了,请原谅我。

我在LINUX环境中工作。

您犯的第一个也是最严重的错误是没有使用

use strict;
use warnings;

这两个杂注提供了比您可能添加的任何其他两行代码都更多的帮助。永远不要在没有它们的情况下编写Perl代码。

use JSON;   
use XML::Simple;
use File::Spec;

您不使用这两个模块中的任何一个,因此对于此代码,它们是多余的。

$num_args = $#ARGV + 1;
if ($num_args != 1) {
    print "nUsage: $0 <input directory>n";
    exit;
}

这可以写

if (@ARGV != 1) {
    print ...
    exit;
}

因为标量上下文中的数组返回其大小。

opendir(DIR, $dir) or die "cannot open directory";
@docs = grep(/.xml$/,readdir(DIR));
foreach $file (@docs) {
    my $abs_path = join("",$dir,$file);

除非你真的需要readdir的精度,否则你最想要的就是glob()。此代码将取代上述代码:

my @docs = glob "$dir/*.xml";

它将返回相对路径(而不是绝对路径,正如变量名所暗示的那样——除非路径参数是绝对的)。例如:examples/foo.xml

sub print_output {
    my $output_object = $_[0];
    print $output_object;
}

我假设这个sub只是一个例子,因为它什么都不做,可以简化为一个简单的print

至于您关于要从中读取的默认目录的问题,对我来说,这与参数的要求不一致(您在其中检查@ARGV)。但你可以做一个简单的存在检查:

if (not -e $dir) {
    $dir = "default";
}

constant杂注和条件语句修饰符将使您的默认逻辑可读:

....
use constant DEFAULT_DIR => '/path/to/default/dir';
....
my $dir = $ARGV[0];
$dir = DEFAULT_DIR unless -e $dir;
....

(是的,请注意其他人的建议:严格、警告、词法目录句柄、修剪不需要的模块、避免$#array等)

opendir(DIR, $dir) or die "cannot open directory";之前,检查目录是否存在,如果不分配$dir变量默认值:

$default_dir = "....";
if (!-e $dir)
{
    $dir = $default_dir;
}

最新更新