在if语句中不能在Perl中运行文件时写入文件

时间:2019-03-20 16:39:27

标签: perl if-statement file-writing

我在这里转了一圈,发现了类似的问题,但不完全是。如果有一个,我表示歉意,请指向我。

我有以下代码。我正在尝试创建一个仅从文件名和文件名本身提取的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错误!它只是忽略了这些行!我在想我有明显的失踪之处。

2 个答案:

答案 0 :(得分:2)

引用File::Find::find的文档:

  

此外,对于找到的每个目录,它将chdir()进入该目录

这意味着当您在openfindAllFiles时,可能会在初始目录的子目录中打开文件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之前将其打开,这似乎是一个更好的主意)。