1

在这个例子中保留块是否可以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};
            }
        }
    }
}
4

2 回答 2

6

如果您的模块更改了终端模式,那么我认为最礼貌的做法是END在程序退出之前安装一个块以恢复终端模式。

于 2013-05-09T12:23:04.947 回答
4

不,这是有礼貌的,并且希望您在找到它们时将它们放回原处。

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

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

如果做不到这一点,POD 应该明确记录该模块在退出时使用系统资源。

于 2013-05-09T17:52:34.487 回答