2013-05-09 35 views
1

在这个例子中保留END块是否可以,因为没有人想要一个坏的终端,或者我不应该把END块放在模块中?在模块中放置一个END块是否不合理?

package My_Package; 
use warnings; 
use strict; 
use Term::ReadKey; 

sub _init_scr { 
    my ($arg) = @_; 
    $arg->{backup_flush} = $|; 
    $| = 1; 
    Term::ReadKey::ReadMode 'ultra-raw'; 
} 

sub _end_win { 
    my ($arg) = @_; 
    print "\n\r"; 
    Term::ReadKey::ReadMode 'restore'; 
    $| = $arg->{backup_flush}; 
} 

END { 
    Term::ReadKey::ReadMode 'restore'; 
} 

sub my_function { 
    my $arg = {}; 
    _init_scr($arg); 
    while (1) { 
     my $c = ReadKey 0; 
     if (! defined $c) { 
      _end_win($arg); 
      warn "EOT"; 
      return; 
     } 
     next if $c eq "\e"; 
     given ($c) { 
      when ($c ge 'a' && $c le 'z') { 
       print $c; 
       $arg->{string} .= $c; 
      } 
      when ($c eq "\cC") { 
       _end_win($arg); 
       print STDERR "^C"; 
       kill('INT', $$); 
       return; 
      } 
      when ($c eq "\r") { 
       _end_win($arg); 
       return $arg->{string}; 
      } 
     } 
    } 
} 
+0

也许* ikegami *可以提供一个明确的答案,但我没有看到任何伤害添加一个'结束'块.. – 2013-05-09 12:20:10

回答

6

如果你的模块改变终端模式,那么我会认为最有礼貌的事情将是它也安装END块的程序退出前恢复终端模式。

4

不,它很有礼貌,并且希望当你找到它们时把它们放回去。

但是,除非您被要求这样做,否则不要整理别人的工作空间。

也就是说,你的END例程不应该运行,除非它有理由这样做,并且你的模块可能应该允许开发者禁用自动清理。 (例如,use My_Package qw(:no_auto_restore)。)

如果不成功,POD应该明确说明模块在退出时摆弄系统资源。

+1

...并在开始!它应该在其文档中提到它与s.t.混淆的所有全球资源。应用程序开发人员可以考虑这一点。 – darch 2013-05-09 18:57:47

相关问题