【问题标题】:Variable taking garbage value inside a loop while calling a command line instance in Perl在 Perl 中调用命令行实例时,变量在循环中获取垃圾值
【发布时间】:2012-02-10 05:15:05
【问题描述】:
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 实例(命令行实例)。在命令行实例成功完成后,标量 $option 获取一些垃圾值并达到 else 条件并打印行“INSERT A VALID OPTION...!!!”。这个过程会一直持续下去,直到强制关闭 Konsole。

谁能告诉我剧本哪里错了。

【问题讨论】:

  • $option 需要一些垃圾值?什么垃圾值?
  • 不知道需要什么,我试图打印出来但什么也没有显示。可能是当命令行退出时它返回一些值并且 $option 将其作为 $ARG[0] 值。我可能不确定。
  • 我试过你的代码(删除了对Login_logout()的调用),它对我来说很好用。 Login_logout() 是做什么的?您能否更新您的帖子以包含其来源?
  • Login_logout 实际上调用了一个 SIPp 实例。实例是“./sipp -sf Reg_UAS.xml -i my_host_ip -p 5060”。为此,您必须在您的机器上安装 SIPp。

标签: linux perl konsole


【解决方案1】:

请记住,&lt;&gt; 需要一行而不是字符串,因此需要删除返回(CR/LF 等)。

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

【讨论】:

  • 虽然chomp ($option = &lt;&gt;) 通常是个好主意,但在这种情况下并非绝对必要。
【解决方案2】:

我认为您的外部程序调用修改/重定向 STDIN 的问题是读取一些垃圾。

设置自动刷新:

$|=1;

如果您在外部调用中不需要标准输入/标准错误,请像这样显式关闭它或将其重定向到文件:

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

或只关闭标准输入

`sih.sh <&-`

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

问候,

【讨论】:

  • @Shantanu:这不应该是你问题的答案吗?
【解决方案3】:

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

【讨论】:

  • 但它仍然应该等待用户在 $option= 语句中输入,然后执行 if-else 语句。而且我还尝试了 $option= 语句而不是简单的 $option=。但没有奏效。循环无限运行,无需等待用户输入。
  • 尝试将您的代码放在if($option =~ m/^\d+$/) 下,您只接受整数..即$option=&lt;STDIN&gt;;if($option =~ m/^\d+$/) {if($option==1) {print("IN THE LOGIN &amp; LOGOUT SCENARIO\n");&amp;Login_logout();}.....
  • 有条件检查,如果 option==3 则退出
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-29
  • 2019-09-29
  • 1970-01-01
相关资源
最近更新 更多