对于介绍性的Web脚本类,我正在研究用Perl编写的项目,该项目处理在服务器上读取文件。我需要收集一个文件名,打开它,对内容进行一些正则表达式匹配,然后输出结果。
文件名输入可以有多种形式:
前两个案例只需要打开一个简单的调用:
...
$file = param('file');
open(FH, "<", $file) || die "Cannot open $file: $!";
while (<FH>) {
# do stuff
}
...
部分限定路径的最后一个案例显然已经死亡。我查看了File :: Find,但无法弄清楚它是如何工作的。这是我使用的正确模块吗?我应该做一些递归的事情来通过目录树向后工作吗?提前感谢任何指示。
编辑: 我的案例非常具体到我教授的指示。我让它通过一个循环:
...
$file = param('file');
$open = open (FH, "<", $file);
while (!defined $open) {
chdir('..') or die "Can't chdir or open $file $!";
$open = open (FH, "<", $file);
}
现在正在打开上述案例3,并且符合我的任务目的,尽管它不是一个可以在广泛情况下起作用的解决方案。
答案 0 :(得分:1)
如果这是该文件的正确路径,则打开dir3/dir4/file.txt
将正常工作。
>md "dir3"
>md "dir3/dir4"
>echo foo >"dir3/dir4/file.txt"
>perl -E"open(my $fh, '<', 'dir3/dir4/file.txt') or die($!); print <$fh>;"
foo
如果不是,那么没有其他信息就无法知道它所引用的文件。
当然,这假设路径是相对于当前工作目录的。如果这些路径与某个其他目录相关,则可以使用以下命令:
use File::Spec::Functions qw( rel2abs );
my $fqfn = rel2abs($qfn, "/home/foo");
open(my $fh, '<', $fqfn) or die($!);
更具体地说,如果这些路径相对于脚本所在的目录,则可以使用以下命令:
use FindBin qw( $RealBin );
use File::Spec::Functions qw( rel2abs );
my $fqfn = rel2abs($qfn, $RealBin);
open(my $fh, '<', $fqfn) or die($!);