访问perl中的默认目录

use*_*611 1 linux shell perl

我有一个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;
 }
Run Code Online (Sandbox Code Playgroud)

我这里的问题是当我正在读取输入目录时,如果不存在,怎么能使上面的脚本从"一些默认目录位置"读取.我尝试添加一些逻辑,但不适合我.这是我的第一个perl脚本,所以请原谅我,如果这个问题太基础了.

我在LINUX环境中工作.

TLP*_*TLP 5

你犯的第一个也是最关键的错误是不使用

use strict;
use warnings;
Run Code Online (Sandbox Code Playgroud)

这两个pragma提供了比你可能添加的任何其他两行代码更多的帮助.永远不要写它们的Perl代码.

use JSON;   
use XML::Simple;
use File::Spec;
Run Code Online (Sandbox Code Playgroud)

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

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

这可以写

if (@ARGV != 1) {
    print ...
    exit;
}
Run Code Online (Sandbox Code Playgroud)

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

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

除非你真的需要精确度readdir,你最常想要的是glob().此代码将替换上面的代码:

my @docs = glob "$dir/*.xml";
Run Code Online (Sandbox Code Playgroud)

它将返回相对路径(不是绝对路径,因为您的变量名称暗示 - 除非路径参数是绝对路径).例如:examples/foo.xml.

sub print_output {
    my $output_object = $_[0];
    print $output_object;
}
Run Code Online (Sandbox Code Playgroud)

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

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

if (not -e $dir) {
    $dir = "default";
}
Run Code Online (Sandbox Code Playgroud)