linux - 访问perl中的默认目录

标签 linux perl shell

我有一个 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;

这两个 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";
}

关于linux - 访问perl中的默认目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28502872/

相关文章:

linux - gcov 没有显示任何覆盖率数据

mysql - mysql 24小时时间窗口中检索数据的日期条件

windows - 在 Windows 上安装 Curl for Perl (WWW::Curl::Easy)

python - 将 printf 添加到文件中所有函数的开头

python - 如何在 bash 中将前缀组合到 ls 的输出?

bash - 用于列出给定目录中的文件以及它们是文件还是目录的 Shell 脚本

linux - AWS CLI 同步错误 - 找不到文件

python - 即使安装了 anaconda 后,默认的 python 也会启动

regex - sed 正则表达式

c++ - 使用反引号时程序不输出