-1

我正在尝试打印到两个不同的文件。出于某种原因,打印语句对一个文件工作正常,但对另一个文件却不行。当我运行这个程序时,filter2.out 包含一行“Beginning”。filter2.err 保持为空。

open(OUTPUT, "> Filter2/filter2.out");
open(ERROR, "> Filter2/filter2.err");
print OUTPUT "Beginning\n";
print ERROR "Beginning\n";

更新:所以我在一个更大的程序开始时运行它,并意识到它只会批量更新错误文件或文件关闭时。知道为什么会这样吗?

4

2 回答 2

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";

中提琴!现在您可以准确地看到问题出在哪里,因为它失败了,并确保您稍后编写的其他库或代码不会意外地干扰您的文件句柄。

于 2013-01-16T18:27:06.553 回答
1

您需要检查您的文件是否已正确打开。此外,最好使用局部变量作为文件句柄而不是裸词:

open( my $err, "> Filter2/filter2.err") or die "Couldn't open error: $!"
print $err "Beginning\n"
于 2013-01-16T18:23:20.367 回答