Переменная, принимающая значение мусора внутри цикла при вызове экземпляра командной строки в 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>;

Другие вопросы по тегам