Переменная, принимающая значение мусора внутри цикла при вызове экземпляра командной строки в Perl - PullRequest
1 голос
/ 10 февраля 2012
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 ]

2 голосов
/ 10 февраля 2012

Помните, что <> занимает строку, а не строку, поэтому необходимо удалить return (CR / LF и т. Д.).

...
$option=<>;
chomp $option; ## chomp removes the tailing return
if($option eq '1')
...
1 голос
/ 10 февраля 2012

Мне кажется, проблема в том, что ваш внешний программный вызов изменяет / перенаправляет STDIN, таким образом, он читает какую-то фигню.

Установить автозапуск:

$|=1;

Если вам не нужен stdin / stderr при внешнем вызове, явно закройте его или перенаправьте в файл:

`sip.sh >&- 2>&- <&-`

или закройте только стандартный

`sih.sh <&-`

Если я прав, этот трюк работает только в последних ksh и bash. По крайней мере, под ksh: -)

С уважением,

0 голосов
/ 10 февраля 2012

do { }while(1); это не что иное, как бесконечный цикл, без проверки условий, поэтому он будет повторяться бесконечно, более при попытке использовать $option=<STDIN>;

...