Не вежливо ли поместить блок 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 должен явно задокументировать, что модуль при выходе завершает работу с системным ресурсом.