【发布时间】:2018-05-30 03:13:45
【问题描述】:
我尝试打开文件夹中的文件列表。最终我想在其中插入一个 HTML 片段。到目前为止,我可以打开文件夹并读取数组中的列表。没关系。但是当我尝试使用变量作为文件名打开文件时,每次都会收到一条错误消息(“权限被拒绝”)。无论我是否使用 $_ 或其他将列表项的值放入变量的变体。我在这里找到了类似的问题,但到目前为止还没有找到解决方案。这是我的代码:
use strict;
use warnings;
my ($line);
opendir (FOLDER,"path/to/folder/./") or die "$!";
my @folderlist = readdir(FOLDER);
my @sorted_folderlist = sort @folderlist;
close(FOLDER);
foreach (@sorted_folderlist) {
my $filename = $_;
open (READ, ">", "path/to/folder/$filename") or die "$!";
# do something
close (READ);
}
这里有什么错误?以及如何使用变量作为文件名打开文件?
普约恩
这是我为了回答 1 而更改的代码:
my $dh;
opendir $dh, "dir/./" or die ...
my @folderlist = grep { -f "dir/$_" } readdir $dh;
close $dh;
my @sorted_folderlist = sort @folderlist;
foreach my $filename (@sorted_folderlist) {
open my $fh, "<", "dir/$filename" or die ...
open my $writeto, ">", "new/$filename" or die ...
print $writeto "$fh";
close $fh;
close $writeto;
}
【问题讨论】:
-
我已经编辑了您的两个代码示例以添加缩进。不客气,但请以后自己做。适当的缩进是帮助人们理解你的代码的重要工具。如果您要求一大群陌生人阅读和理解您的代码,那么让他们尽可能简单肯定是礼貌的做法。
-
嗯。在您应用@tinita 的提议后,您编辑了您的问题并显示了您的工作代码,这非常好。我明白你想分享它并告诉我们“看看我是如何让它工作的”。但现在这不再是一个问题。它已经包含一个答案。人们会试图找出你的第二个代码 sn-p 出了什么问题,然后发现……什么也没有。 /// 我不确定如何处理。有人有想法吗? @戴夫?
-
嗯,我编辑了我的问题,因为我实际上认为表现出我对答案表示赞赏是有礼貌的。如果合理的话,我可以删除第二个代码示例。 @DaveCross:当然,我会看看的。
-
@PerlDuck:我认为这个问题仍然很清楚。并且第二个代码示例中仍然存在明显的问题-例如
print $writeto "$fh"很奇怪:-) -
@Pjoern 你添加了
print $writeto "$fh";。打印到$writeto好吧,但它打印的是文件句柄$fh本身(不需要在""下评估它,也不会改变任何东西。);所以它会打印出类似GLOB(0x1820a68)的东西。相反,从该输入中读取,处理该行,然后将其打印到输出while(my $line = <$fh>) { process-$line; print $writeto $line; }