大多数时候,我会做这样的事情:
open FH, ">file.txt" or die "Cann't open file: $!";
die
一定要使用吗?如果我希望我的脚本继续运行(如果文件无法打开则忽略错误),我应该怎么做?
大多数时候,我会做这样的事情:
open FH, ">file.txt" or die "Cann't open file: $!";
die
一定要使用吗?如果我希望我的脚本继续运行(如果文件无法打开则忽略错误),我应该怎么做?
你可能想做类似的事情
if(open my $fh, ">", "file.txt") {
# do stuff with file
close $fh;
}
else {
# do stuff without file
}
如果代码die
无法访问文件,则不必这样做。
如果写入文件是可选的,您可以执行以下操作:
my $file_is_ok = 0;
open FH, ">file.txt" and $file_is_ok = 1;
warn "No logging available" unless $file_is_ok;
然后无论你想在哪里使用文件句柄,你都可以先检查它是否可以:
$file_is_ok and print FH "Something happened";
通常你会想要比上面更多的抽象,但我希望这足以开始。
不,die
绝对不必使用,否则失败open
只会退出程序。这只是一个常用的结构,因为通常如果您无法打开文件,则继续没有意义,但实际上也不需要die
或做任何其他事情。
我可能会做类似的事情:
sub process_file {
my $file = shift;
open(my $fh, ">", $file) or return;
# write to file ...
}
open(my $fh, ">", $file) or print "open failed , you are on your own\n";
建议您改用croak()
from Carp
,尤其是在模块或对象中。见http://perldoc.perl.org/Carp.html
Carp
是一个标准模块,与所有标准模块一样,随 Perl 一起安装。所有标准模块的列表可在perlmodlib
. 请参阅http://perldoc.perl.org/perlmodlib.html
很抱歉回答了几个月前的问题,但我这样做的方式是实现我自己的die
样式子例程:
sub fail {
my $text = $_[0];
# Do error-related stuff here, like send an email
die($text) # or just exit
}
open(my $fh, ">file.txt") or fail("Unable to open file: $!");
您可以使用 try catch 块,使用 Try::Tiny 或类似的东西。
如果您尝试做的是避免在打开文件时遇到错误时退出程序,那么省略die
不是正确的方法。 die
是 Perl 的异常机制;它默认中止程序的事实是偶然的,而不是基本的属性。如果您提供异常处理程序,您将保留控制权。正确的方法是捕获异常并在finally
块中进行清理。
use 5.10.0;
use Try::Tiny;
my ($infile, $FH);
try {
open $infile, '<', 'infile.txt' or die "Can't open infile";
try {
open $FH, '>', 'file.txt' or die "Can't open outfile";
my $line = <$infile>;
print $FH $line;
say 'Cleaning up $FH';
close $FH;
} finally {
say 'Cleaning up $infile';
close $infile;
} catch {
die $_;
};
} catch {
die $_;
};
因此,如果open $infile ...
失败,则die
转到catch
块,该块将重新执行并中止脚本。但是一旦我们打开了$infile
,如果open $FH
失败,就会死在一个 catch 块中,该块也会中止程序,但会强制close $infile
先发生。文件句柄不是在程序退出之前清理资源的最佳示例,因为解释器会自动关闭文件,但基本思想就在那里。
如果您不喜欢嵌套try
块,您可以通过检查哪个异常导致块中止并根据此决定需要进行哪些清理来实现非常相似的效果。这比任何提到的都更脆弱,但仍然更强大goto
。