我有一个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;
}
答案 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
。