3

我有一个 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 概念: 如何遍历目录中的所有文件;如果它有子目录,我也想遍历子目录中的文件 Find::File 来搜索文件列表的目录

#!/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;
}
4

3 回答 3

3

File::Find 的文档中说:

当函数被调用时,你是 chdir()'d 到 $File::Find::dir,除非指定了 no_chdir。请注意,当更改到目录时,根目录 (/) 是一种特殊情况,因为 $File::Find::dir、'/' 和 $_ 的串联并不等于 $File::Find ::姓名。

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

$_ = $File::Find::name; 
于 2013-05-13T17:17:51.833 回答
1

find自动更改目录,以便$File::Find::name不再与当前目录相关。

您可以删除此行以使其正常工作:

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

另请参阅文件::查找 no_chdir

于 2013-05-13T17:17:43.133 回答
1

文件::查找文档:

对于找到的每个文件或目录,它调用 &wanted 子例程。(有关如何使用 &wanted 功能的详细信息,请参见下文)。此外,对于找到的每个目录,它将 chdir() 进入该目录并继续搜索,在目录中的每个文件或子目录上调用 &wanted 函数。

(强调我的)

它没有找到的原因./sub/file1.html是,当open被调用时, File::Find 已经把chdir你编入./sub/. 您应该能够以file1.html.

于 2013-05-13T17:17:55.833 回答