# ... use Encode::Locale; sub __init_term { my ( $self ) = @_; # Windows: $self->{input} = Win32::Console->new( STD_INPUT_HANDLE ); $self->{old_in_mode} = $self->{input}->Mode(); $self->{input}->Mode( ENABLE_PROCESSED_INPUT ); # Linux: #ReadMode( 'cbreak' ); } sub __get_key { my ( $self ) = @_; # Windows: return $self->{input}->InputChar(); # Linux: #return ReadKey( 0 ); } sub readline { my ( $self, $prompt, $opt ) = @_; # ... # ... local $| = 1; $self->__init_term(); my $str = encode( 'console_in', $opt->{default} ); $self->__print_readline( $opt, $prompt, $str ); while ( 1 ) { my $key = $self->{plugin}->__get_key(); return if ! defined $key; elsif ( $key eq "\n" or $key eq "\r" ) { print "\n"; $self->__reset_term(); return decode( 'console_in', $str ) if $^O eq 'MSWin32'; return decode( 'console_in', $str ) if utf8::is_utf8( $key ); return $str; } elsif ( ord $key == BSPACE || $key eq "\cH" ) { if ( length $str ) { $str = decode( 'console_in', $str ); $str =~ s/\X\z//; $str = encode( 'console_in', $str ); } $self->__print_readline( $opt, $prompt, $str ); next; } $key = encode( 'console_in', $key ) if utf8::is_utf8( $key ); $str .= $key; $self->__print_readline( $opt, $prompt, $str ); } } # ...