Переменная, принимающая значение мусора внутри цикла при вызове экземпляра командной строки в Perl
do
{
print"CHOOSE ANY OF THE FOLLOWING OPTIONS:\n";
print"==========================================\n";
print"1-LOGIN & LOGOUT\n";
print"2-MAKE CALL\n";
print"3-EXIT\n";
print"==========================================\n";
print("\nENTER YOUR OPTION: ");
$option=<>;
if($option==1)
{
print("IN THE LOGIN & LOGOUT SCENARIO\n");
&Login_logout();
}
elsif($option==2)
{
print("IN THE MAKE CALL SCENARIO\n");
}
elsif($option==3)
{
print("\nEXITING...\n");
exit(0);
}
else
{
print"\nINSERT A VALID OPTION...!!!\n";
}
}while(1);
Здесь подпрограмма Login_logout() вызывает экземпляр SIPp (экземпляр командной строки). После успешного завершения экземпляра командной строки опция скаляра $ принимает некоторое значение мусора и попадает в условие else и печатает строку "INSERT A VALID OPTION...!!!". Этот процесс продолжается бесконечно до принудительного закрытия консоли.
Может кто-нибудь сказать мне, где я не прав в сценарии.
3 ответа
Я думаю, что проблема в том, что ваш внешний вызов программы изменяет / перенаправляет STDIN, таким образом, он читает какую-то фигню.
Установить автозапуск:
$|=1;
Если вам не нужен stdin / stderr при внешнем вызове, закройте его явно следующим образом или перенаправьте в файл:
`sip.sh >&- 2>&- <&-`
или закрыть только стандартный
`sih.sh <&-`
Если я прав, этот трюк работает только в последних ksh и bash. По крайней мере, под ksh:-)
С уважением,
Помни что <>
занимает строку, а не строку, поэтому необходимо удалить return (CR/LF и т. д.).
...
$option=<>;
chomp $option; ## chomp removes the tailing return
if($option eq '1')
...
do {
}while(1);
это не что иное, как бесконечный цикл, без проверки условий, поэтому он будет проходить бесконечно, более того, попробуйте использовать $option=<STDIN>;