我在这里转了一圈,发现了类似的问题,但不完全是。如果有一个,我表示歉意,请指向我。
我有以下代码。我正在尝试创建一个仅从文件名和文件名本身提取的ID的csv文件。这是整个脚本。
use strict;
use warnings;
use File::Find;
find( \&findAllFiles, '.');
exit;
sub findAllFiles {
my @fp1;
my @fp2;
my $patId;
my $filename;
my $testvar = "hello again";
$filename = $File::Find::name;
if ($filename =~ /\.pdf$/) {
open (my $fh, '>', 'filenames.csv') or die "Failed to open - $!\n";
print $fh "starting...$testvar\n" or die "Failed to print to file - $!\n";
@fp1 = split('/', $filename);
@fp2 = split('_', $fp1[-1]);
$patId = $fp2[-1];
$patId =~ s/\.pdf$//;
print "Adding $patId, file = $filename\n";
print $fh "$patId,$filename\n" or die "File print error: $!";
close $fh or warn "close failed! - $!";
}
return;
}
打印到屏幕上的线条可以完美打印。
如果我从if
块中取出文件open / close和第一个print语句,它将把该行打印到文件中,而不是块中的数据。
我已经尝试过所有我能想到的组合,但它不起作用。我在'>'
和'>>'
之间进行了切换,因为由于它遍历了文件名,因此它显然需要附加,但是在if
块中都无效。
即使上面的这段代码也不会引发die
错误!它只是忽略了这些行!我在想我有明显的失踪之处。
答案 0 :(得分:2)
引用File::Find::find
的文档:
此外,对于找到的每个目录,它将chdir()进入该目录
这意味着当您在open
中findAllFiles
时,可能会在初始目录的子目录中打开文件filenames.csv
。您可以从终端运行类似find . -name filenames.csv
之类的内容,并且会看到大量filenames.csv
。您可以通过将no_chdir
选项传递给find
来更改此行为:
find( { wanted => \&findAllFiles, no_chdir => 1}, '.');
(并在您的打开位置另外为>
更改>>
)
但是,就我个人而言,当您在致电filenames.csv
之前可以一次打开find
时,我会避免重复打开和关闭它。如果您不想全局定义文件句柄,则始终可以将其作为参数传递给findAllFiles
:
{
open my $fh, '>', 'filenames.csv' or die "Failed to open 'filenames.csv': $!";
find(sub { findAllFiles($fh) }, '.')
}
sub findAllFiles {
my ($fh) = @_;
...
答案 1 :(得分:1)
filenames.csv将在找到pdf的目录中创建,因为find()会在搜索时更改目录。如果这不是您想要的,请使用绝对路径将其打开(或在调用find之前将其打开,这似乎是一个更好的主意)。