尝试将子目录作为Perl中的参数传递

时间:2013-05-13 16:50:34

标签: perl

我有一个Perl程序来读取.html,只有当程序与.html的目录相同时才有效。
我希望能够从不同的目录开始并将html的位置作为参数传递。程序(下面的shell示例)遍历子目录“sub” 和它的子目录来查找.html的,但仅当我的perl文件在同一子目录“sub”中时才有效。如果我把Perl文件 在主目录中,它是从子目录“sub”向后退一步,它不起作用。

在shell中,如果我从我的主目录中键入“perl project.pl ./sub”,它说可以 不能打开./sub/file1.html。没有相应的文件和目录。然而,文件确实存在于那个确切的位置。 file1.html是它试图读取的第一个文件。

如果我将shell中的目录更改为该子目录并移动.pl文件 然后在shell中说:“perl project.pl ./”一切都好。

要搜索目录,我一直在使用我在这里找到的File :: Find概念: How to traverse all the files in a directory; if it has subdirectories, I want to traverse files in subdirectories too Find::File to search a directory of a list of files

#!/usr/bin/perl -w
use strict;
use warnings;
use File::Find;

find( \&directories, $ARGV[0]);

sub directories {
    $_ = $File::Find::name;

    if(/.*\.html$/){#only read file on local drive if it is an .html
        my $file = $_;
        open my $info, $file or die "Could not open $file: $!";
        while(my $line = <$info>)  {   

        #perform operations on file
        }
        close $info;
    }
    return;
}

3 个答案:

答案 0 :(得分:3)

documentation of File::Find中说:

  

当调用函数时,你是$ File :: Find :: dir的chdir()'   除非指定了no_chdir。请注意,更改为目录时   实际上根目录(/)是一个有点特殊的情况   因为$ File :: Find :: dir,'/'和$ _的串联不是   字面上等于$ File :: Find :: name。

所以你实际上已经在~/sub。仅使用$_的文件名。您不需要覆盖它。删除行:

$_ = $File::Find::name; 

答案 1 :(得分:1)

find自动更改目录,以使$File::Find::name不再相对于当前目录。

您可以删除此行以使其生效:

$_ = $File::Find::name;

另请参阅File::Find no_chdir

答案 2 :(得分:1)

来自File::Find文档:

  

对于找到的每个文件或目录,它会调用&amp; wanted子例程。   (有关如何使用&amp;想要的功能的详细信息,请参见下文)。   另外,对于找到的每个目录,它将chdir()放入其中   目录并继续搜索,调用&amp;想要的功能   目录中的每个文件或子目录。

(强调我的)

找不到./sub/file1.html的原因是,当调用open时,File :: Find已经chdir将您加入./sub/。您应该能够将文件打开为file1.html