在Perl中调用命令行实例时,在循环内变量获取垃圾值

时间:2012-02-10 05:15:06

标签: linux perl konsole

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 ... !!!”行。这个过程将继续进行,直到强制关闭Konsole。

任何人都可以告诉我脚本中的错误。

3 个答案:

答案 0 :(得分:2)

请记住,<>需要一行而不是一个字符串,因此需要删除return(CR / LF等)。

...
$option=<>;
chomp $option; ## chomp removes the tailing return
if($option eq '1')
...

答案 1 :(得分:1)

我认为你的外部程序调用修改/重定向STDIN的问题,就像它读取垃圾一样。

设置autoflush:

$|=1;

如果您在外部呼叫中不需要stdin / stderr,请将其显式关闭或将其重定向到文件:

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

或仅关闭stdin

`sih.sh <&-`

如果我是正确的,这个技巧只能在最近的ksh和bash下运行。至少在ksh下: - )

的问候,

答案 2 :(得分:-1)

do { }while(1);这只是无限循环,没有条件检查所以它会无限循环,更多尝试使用$option=<STDIN>;