从Perl中的部分限定路径打开文件

时间:2014-02-05 01:39:44

标签: perl

对于介绍性的Web脚本类,我正在研究用Perl编写的项目,该项目处理在服务器上读取文件。我需要收集一个文件名,打开它,对内容进行一些正则表达式匹配,然后输出结果。

文件名输入可以有多种形式:

  • “file.txt的”
  • “/ DIR1 / DIR2 / DIR3 / dir4 / file.txt的”
  • “DIR3 / dir4 / file.txt的”

前两个案例只需要打开一个简单的调用:

...
$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,并且符合我的任务目的,尽管它不是一个可以在广泛情况下起作用的解决方案。

1 个答案:

答案 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($!);