我正在尝试打印出两个不同的文件。出于某种原因,print语句适用于一个文件,但不适用于另一个文件。当我运行这个程序时,filter2.out由一行显示为“Beginning”。 filter2.err仍为空。
open(OUTPUT, "> Filter2/filter2.out");
open(ERROR, "> Filter2/filter2.err");
print OUTPUT "Beginning\n";
print ERROR "Beginning\n";
更新:所以我在一个更大的程序开始时运行它,并意识到它只批量更新ERROR文件或文件关闭时。知道为什么会这样吗?
答案 0 :(得分:9)
考虑添加
use strict;
use warnings;
到你的脚本的顶部。这些语句将有助于捕获Perl默默忽略的错误。此外,请考虑向您的open
电话添加错误检查:很可能,它实际上并未打开。我会这样写:
use strict;
use warnings;
open(OUTPUT, "> Filter2/filter2.out")
or die "Can't open filter2.out: $!";
open(ERROR, "> Filter2/filter2.err")
or die "Can't open filter2.err: $!";
print OUTPUT "Beginning\n";
print ERROR "Beginning\n";
例如,通过添加添加严格和警告我得到了:
print() on closed filehandle OUTPUT at .\printer.pl line 6.
print() on closed filehandle ERROR at .\printer.pl line 7.
嗯......!
通过添加错误检查,我得到了:
PS C:\dev> perl .\printer.pl
Can't open filter2.out: No such file or directory at .\printer.pl line 4.
啊哈!看,我没有文件夹。添加文件夹后,一切运行正常。你可能会发现类似的东西。
最后,你应该也可以使用现代的词法文件句柄。这有助于捕获其他错误(例如重用的句柄名称。)因此,最终的脚本将如下所示:
use strict;
use warnings;
open(my $output, ">", "Filter2/filter2.out")
or die "Can't open filter2.out: $!";
open(my $error, ">", "Filter2/filter2.err")
or die "Can't open filter2.err: $!";
print $output "Beginning\n";
print $error "Beginning\n";
中提琴!现在,您可以确切地看到问题失败的原因,因为它失败了,并确保您稍后编写的其他库或代码不会意外地干扰您的文件句柄。
答案 1 :(得分:1)
您需要检查您的文件是否已正确打开。最好将局部变量用作文件句柄而不是简单的单词:
open( my $err, "> Filter2/filter2.err") or die "Couldn't open error: $!"
print $err "Beginning\n"