如何将此脚本指向一个文件夹以供阅读,另一个用于写入

时间:2014-11-12 01:46:03

标签: perl directory

我似乎无法从一个目录中打开此脚本并写入另一个目录。这两个目录都存在。我已经评论了我的尝试。有趣的是,当我将它放在要处理的文件的目录中时它运行正常。这是代码:

 use strict;
 use warnings "all";
 my $tmp;
 my $dir = ".";
 #my $dir = "Ask/Parsed/Html4/";
 opendir(DIR, $dir) or die "Cannot open directory: $dir!\n";
 my @files = readdir(DIR);
 closedir(DIR);
 open my $out, ">>output.txt" or die "Cannot open output.txt!\n";
 #open my $out, ">>Ask/Parsed/Html5/output.txt" or die "Cannot open output.txt!\n";
 foreach my $file (@files)
 {
 if($file =~ /html$/)
 {
    open my $in, "<$file" or die "Cannot open $file!\n";
    undef $tmp;
    while(<$in>)
    {
        $tmp .= $_;
    }
    print $out ">$file\n";
    print $out "$tmp\n";
    #print $out "===============";
    close $in;
  }
  }
  close $out;

3 个答案:

答案 0 :(得分:2)

您使用的目录 - .Ask/Parsed/Html4/ - 是相对路径,这意味着它们与您当前的工作目录相关,因此它有所不同运行脚本时文件系统中当前所在的位置。

此外,您正在打开的文件 - output.txt$file - 没有路径信息,因此Perl会查看您当前的工作目录以查找它们。

有几种方法可以解决这个问题。

  • 在运行脚本之前,您可以cd到您的文件所在的目录,并像目前一样以.打开目录

  • 您可以通过在脚本中调用chdir来实现相同的效果,这将更改当前的工作目录并使程序在您运行时忽略您的位置

  • 或者您可以将绝对目录路径添加到文件名的开头,最好使用catfile

  • 中的File::Spec::Functions

但是我会选择使用glob - 它的工作方式与命令行文件名扩展相同 - 优先于opendir / {{1}由于结果字符串包含路径(如果在参数中指定了一个),并且不需要单独过滤readdir个文件。

我还会选择取消定义输入记录分隔符 .html来读取整个文件,而不是逐行读取它们并将它们连接起来。

最后,如果你运行的是Perl 5的10或更高版本,那么$/更简单,而不是检查每个use autodieopenreadline的成功与否,closeopendirreaddir等。

像这样的东西

closedir

答案 1 :(得分:0)

可能会尝试从您从哪里调用此文件来访问这些文件。如果您的文件位于相对于脚本位置的位置,请使用以下示例提供完整路径;

use FindBin; 
my $file = "$FindBin::Bin/Ask/Parsed/Html5/output.txt";

如果您的文件与脚本无关,请提供完整路径;

my $file = "/home/john.doe/Ask/Parsed/Html5/output.txt";

答案 2 :(得分:0)

请注意,readdir()仅返回文件名。如果要在目录前打开它

例如

打开我的$ in,&#34;&lt;&#34;,&#34; $ dir / $ file&#34;或死&#34;无法打开$ file!\ n&#34;;

请注意,最佳做法是说您应该使用open的三个参数版本,否则