这不是一个问题。 我想我发明了新的惯用语 - 优雅的说法: 做一些事情,如果失败,试着修复它再做一次。 如果失败三次,就放弃。它看起来不错吗?
use strict;
write_file('lol');
write_file('abc');
write_file('def');
write_file('ijk');
my $depth;
sub write_file
{
if ( $depth++ > 3 ) { die 'FAIL' };
print FILE $depth.join ', ', @_ or open(FILE, '>log'), write_file(@_);
$depth = 0;
}
答案 0 :(得分:1)
任何循环都可以通过递归来实现。这并不意味着你应该!
sub write_file
{
my $tries = 3; # Retries until it fails this many times.
my $FILE;
while (1) {
open($FILE, '>>', 'log')
and last;
die $! if !--$tries;
}
print $FILE join(', ', @_);
}
但为什么你认为尝试不止一次会有所帮助?无法创建文件主要是由权限错误引起的,或者因为您尝试创建该文件的目录不存在。在这种情况下,多次尝试不会有所帮助。
无论如何要回答你的问题(因为它与其他场景相关),请将深度作为参数传递。
sub visit {
my ($tree, $depth) = @_;
$depth //= 0;
...
visit($node, $depth+1);
...
}
visit($tree);
答案 1 :(得分:0)
如何只是打开文件以追加(>>
)而不是使用覆盖(>
)?并且你不应该在子程序中使用“全局”变量和全局文件句柄,这只是要求麻烦。
write_file('lol');
write_file('abc');
write_file('def');
write_file('ijk');
sub write_file {
my $file = "log";
open my $fh, ">>", $file or die "Cannot open '$file': $!";
print $fh @_;
close $fh;
}
使用词法文件句柄和三参数打开,确保您的文件句柄仅在您需要时打开,并且模式是您想要的。在调试时,检查open
的{{1}}和错误报告die
的返回值是非常宝贵的。
不,这个成语是“如果一开始你失败了,试着再试一次。” :)有人可能会在那里投入“并阅读文档”,其中涉及到perl。