Не вежливо ли поместить блок 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};
            }
        }
    }
}

2 ответа

Решение

Если ваш модуль меняет режим терминала, то я думаю, что наиболее вежливым будет сделать для него установку END блок для восстановления режима терминала до выхода из программы.

Нет, это вежливо и ожидал, что вы положите вещи обратно, как вы их нашли.

Однако нежелательно приводить в порядок чужое рабочее пространство, если вас об этом не просят.

То есть ваша процедура END не должна запускаться, если у нее нет причин для этого, и ваш модуль, вероятно, должен позволить разработчику отключить автоматическую очистку. (Например, use My_Package qw(:no_auto_restore).)

В противном случае POD должен явно задокументировать, что модуль при выходе завершает работу с системным ресурсом.

Другие вопросы по тегам