我似乎无法从一个目录中打开此脚本并写入另一个目录。这两个目录都存在。我已经评论了我的尝试。有趣的是,当我将它放在要处理的文件的目录中时它运行正常。这是代码:
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;
答案 0 :(得分:2)
您使用的目录 - .
和Ask/Parsed/Html4/
- 是相对路径,这意味着它们与您当前的工作目录相关,因此它有所不同运行脚本时文件系统中当前所在的位置。
此外,您正在打开的文件 - output.txt
和$file
- 没有路径信息,因此Perl会查看您当前的工作目录以查找它们。
有几种方法可以解决这个问题。
在运行脚本之前,您可以cd
到您的文件所在的目录,并像目前一样以.
打开目录
您可以通过在脚本中调用chdir
来实现相同的效果,这将更改当前的工作目录并使程序在您运行时忽略您的位置
或者您可以将绝对目录路径添加到文件名的开头,最好使用catfile
File::Spec::Functions
但是我会选择使用glob
- 它的工作方式与命令行文件名扩展相同 - 优先于opendir
/ {{1}由于结果字符串包含路径(如果在参数中指定了一个),并且不需要单独过滤readdir
个文件。
我还会选择取消定义输入记录分隔符 .html
来读取整个文件,而不是逐行读取它们并将它们连接起来。
最后,如果你运行的是Perl 5的10或更高版本,那么$/
更简单,而不是检查每个use autodie
,open
,readline
的成功与否,close
,opendir
和readdir
等。
像这样的东西
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的三个参数版本,否则