Начнем с того, что я работаю с Perl v5.8.4, и у меня нет возможности обновить Perl или установить Term::ReadKey
или IO::Prompt
(или что-то, кроме того, что находится в Core), поэтому, пожалуйста, примите этопри ответе / комментировании.
Я пытаюсь написать полностью автономный скрипт Perl, который (помимо прочего) запрашивает пароль.Он должен быть кросс-платформенным, совместимым между Windows, AIX и Solaris.Я не хочу, чтобы он отображал пароль, когда он напечатан.Вот что у меня есть:
BEGIN {
if ($^O eq 'MSWin32') {
require Win32::Console;
Win32::Console->import();
}
}
sub get_password {
print "Enter password: ";
my $pass = '';
# Change terminal settings to not display password
if ($os eq 'MSWin32') {
my $stdin = new Win32::Console STD_INPUT_HANDLE;
my $orig_mode = $stdin->Mode();
$stdin->Mode(ENABLE_LINE_INPUT | ENABLE_PROCESSED_INPUT | +ENABLE_MOUSE_INPUT);
chomp($pass = <STDIN>);
$stdin->Mode($orig_mode);
}
else {
system('stty', '-echo');
chomp($password = <STDIN>);
system('stty', 'echo');
}
print "\n";
return $pass;
}
Это прекрасно работает на всех платформах (при условии, что я не use strict
), однако, 4 константы, используемые в Win32, выдают ошибки при strict subs
в Unix:
Bareword "STD_INPUT_HANDLE" not allowed while "strict subs" in use at script.pl line 488.
Bareword "ENABLE_LINE_INPUT" not allowed while "strict subs" in use at script.pl line 490.
Bareword "ENABLE_PROCESSED_INPUT" not allowed while "strict subs" in use at script.pl line 490.
Bareword "ENABLE_MOUSE_INPUT" not allowed while "strict subs" in use at script.pl line 490.
Я не могу понять, как сделать так, чтобы Windows и Unix были довольны этими 4 константами.Если я попытаюсь определить их в блоке Unix only, компилятор Windows скажет мне, что я переопределяю их.
Можно ли это исправить?Или, возможно, сделать это по-другому?Заранее спасибо за помощь.