-2

这不完全是一个问题。我想我发明了新的成语——优雅的表达方式:做某事,如果失败,尝试修复它,然后再做一次。如果失败了3次,就放弃。它看起来不错吗?

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;
}
4

2 回答 2

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);
于 2013-05-23T15:00:52.807 回答
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 可以确保文件句柄仅在需要时打开,并且模式是您想要的。open在调试时检查withdie和错误报告的返回值$!是无价的。

不,成语是“如果一开始你失败了,试试,再试一次”。:) 在涉及 perl 的地方也可能会在其中添加“并阅读文档”。

于 2013-05-23T12:31:16.493 回答