Perl 附加文件间歇性失败

Perl 附加文件间歇性失败,perl,Perl,我正在使用下面的脚本来附加两个文件,它间歇性地无法附加,并且没有错误输出 (my $file1, my $file2) = @ARGV; open(FILE1, ">>$file1"); open(FILE2, "<$file2"); while ( <FILE2> ) { print FILE1 $_; } close(FILE2); close(FILE1); (my$file1,my$file2)=@ARGV; 打开(FILE1“>>$FIL

我正在使用下面的脚本来附加两个文件,它间歇性地无法附加,并且没有错误输出

(my $file1, my $file2) = @ARGV;

open(FILE1, ">>$file1");
open(FILE2, "<$file2");

while ( <FILE2> ) {
    print FILE1 $_;
}

close(FILE2);
close(FILE1); 
(my$file1,my$file2)=@ARGV;
打开(FILE1“>>$FILE1”);

打开(文件2,“尝试此版本以获取错误消息:

open(FILE1,">>", $file1) or die $!;
open(FILE2, "<", $file2) or die $!;
open(FILE1,“>>”,$FILE1)或die$!;

open(FILE2,“代码的主要问题是,它包含许多可能会失败的操作,但您没有检查错误,因此在出现故障时,程序将尝试以静默方式继续

代码中可能失败的三个函数是
打开
打印
关闭
。在每种情况下,函数在成功或失败时都将返回真值,返回假值,并将失败消息存储在特殊的全局变量
$!

你写了:

open(FILE1,">>$file1");
这最好写为:

open(my $out, '>>', $file1) || die "open(>>$file1): $!";
或者,您可以使用优先级较低的
运算符并跳过括号:

open my $out, '>>', $file1 or die "open(>>$file1): $!";
您可以简单地调用
die$!
,但这会给您一条错误消息,如
权限被拒绝
,并且不会告诉您哪个操作失败(尽管
die
会添加发生故障的行号)。有时失败是由于包含文件名的变量中包含意外的内容,因此打印出来也是一个好习惯

您的代码包含一些非常旧的样式,因此我将旧样式的
FILE1
global替换为词汇范围的
$out
。我还使用了open的3参数形式,从安全角度来看,这是一个更好的主意

print
调用也可能失败(例如,如果磁盘已满)。这不太可能,检查
print
的返回值常常被忽略。
close
调用也可能失败(例如:在关闭文件句柄之前,输出缓冲区可能不会被刷新,然后类似磁盘已满的情况可能会触发故障)

记住在所有I/O函数调用的末尾添加
或die“…$!”
有点乏味,因此更好的方法是在脚本开始时将
autodie
pragma添加到锅炉板中。然后您可以忽略显式错误检查,
autodie
模块将为您生成消息:

use strict;
use warnings;
use autodie;

my($file1,  $file2) = @ARGV;
open my $out, '>>',  $file1;
open my $in,  '<',   $file2;
while (<$in>) {
    print $out $_;
}

close($in);
close($out); 

这会告诉您哪个操作失败,参数是什么以及失败的原因。因此,通过使用
autodie
,您可以以较少的工作量获得大量错误消息。

如果文件未打开,则会抛出消息?@Sriyad您有什么消息?我建议还显示词法文件句柄,并在上提到
使用警告;
ce你在这里遇到了代码中的什么错误?这里没有错误。但是:(1)始终选中:
打开我的$fh,“>>”,$file或die“无法打开$file:$!”;
(关键是,如果有错误,它会显示实际错误)(2)你在开始时是否有
使用警告;
?如何“添加失败”以及如何“间歇”添加它是这样做的吗?在一个文件中,这里或那里有一行,或者在许多文件中没有附加任何内容?顺便说一句,您通常会说
my($v1,$v2,…)
,而不是
(my$v1,my$v2)
谢谢您的详细解释,将添加此代码。
Can't open '/etc/shadow' for reading: 'Permission denied' at ./ptst.pl line 8