【问题标题】:Accessing Default directory in perl在 perl 中访问默认目录
【发布时间】:2015-02-14 00:56:06
【问题描述】:

我有一个 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 环境下工作。

【问题讨论】:

标签: linux perl shell


【解决方案1】:

你犯的第一个也是最严重的错误是不使用

use strict;
use warnings;

这两个 pragma 提供的帮助比您可能添加的任何其他两行代码都多。不要在没有它们的情况下编写 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";
}

【讨论】:

  • 是的,我会确保我会使用 use strict;使用警告; , 在我的 perl 脚本中。这是我第一次从事 perl 工作,所以对良好的 perl 编程实践了解不多。
【解决方案2】:

constant pragma 和条件statement modifier 将使您的默认逻辑更具可读性:

....
use constant DEFAULT_DIR => '/path/to/default/dir';
....

my $dir = $ARGV[0];
$dir = DEFAULT_DIR unless -e $dir;
....

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2022-12-24
      • 2011-04-09
      • 1970-01-01
      • 2021-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-10
      相关资源
      最近更新 更多