Согласно моему второму редактированию, я придумала что-то, что работает, но имеет несколько ошибок, и это было принято для того, что мне нужно было сделать (во-первых, это никогда не было моей работой, поэтому они не могли жаловаться):
=IF(B2 = SMALL(OFFSET(B2,-C2,0,IF(C3 = 0, C2 + 1,MAX(C2:C5)+1),1), 1),TRUE,FALSE)
Если кто-то может решить проблемы, связанные с функцией SMALL, пропуская значения, одинаковые по диапазону и динамической высоте, то у вас есть надежная формула для подобных вещей.
Можно играть с Термином:: ReadKey. Вот очень простой пример с некоторым обнаружением для клавиши Backspace и клавиши Delete. Я протестировал его на Mac OS X 10.5, но согласно руководству ReadKey это должно работать в соответствии с Windows. Руководство указывает на это при чтениях неблокирования использования Windows (ReadKey(-1)
) перестанет работать. Вот почему я использую ReadKey (0), кто в основном getc
(больше на getc в libc руководстве).
#!/usr/bin/perl
use strict;
use warnings;
use Term::ReadKey;
my $key = 0;
my $password = "";
print "\nPlease input your password: ";
# Start reading the keys
ReadMode(4); #Disable the control keys
while(ord($key = ReadKey(0)) != 10)
# This will continue until the Enter key is pressed (decimal value of 10)
{
# For all value of ord($key) see http://www.asciitable.com/
if(ord($key) == 127 || ord($key) == 8) {
# DEL/Backspace was pressed
#1. Remove the last char from the password
chop($password);
#2 move the cursor back by one, print a blank character, move the cursor back by one
print "\b \b";
} elsif(ord($key) < 32) {
# Do nothing with these control characters
} else {
$password = $password.$key;
print "*(".ord($key).")";
}
}
ReadMode(0); #Reset the terminal once we are done
print "\n\nYour super secret password is: $password\n";
В прошлом я использовал IO:: Подсказка для этого.
use IO::Prompt;
my $password = prompt('Password:', -e => '*');
print "$password\n";
Необходимо смотреть на любой Термин:: ReadKey или Win32:: Консоль. Можно использовать те модули, чтобы считать единственные нажатия клавиш и испустить '*' или безотносительно.
Вы попытались хранить строку (так, чтобы Ваша программа могла все еще считать ее), и узнайте, что ее длина затем создает строку той же длины, но только использует '*'?
Если вы не хотите использовать какие-либо пакеты ... Только для UNIX
system('stty','-echo');
chop($password=<STDIN>);
system('stty','echo');