【问题标题】:Perl Code required to break loop when key pressed按下按键时需要中断循环的 Perl 代码
【发布时间】:2013-07-15 04:33:16
【问题描述】:

我有一个可以执行的脚本,但我需要一个循环来告诉进程休眠 20-30 秒,同时用户运行不同的测试。

一旦测试完成,用户按下 Enter 从脚本停止的地方继续。如果在 20-30 秒内没有按下 Enter,则脚本将继续运行而无需用户输入。

我尝试了以下代码,但它无限期地暂停了脚本 - 20 秒后它不会继续,但它也不接受 Enter

use Term::ReadKey;
ReadMode 4;
do {
    sleep 20; 
} until ( defined( $key = ReadKey(-1) ) );
ReadMode 0;

【问题讨论】:

    标签: perl


    【解决方案1】:

    尝试使用while 循环而不是do{}

    #!usr/bin/perl
    use strict;
    use warnings;
    use Term::ReadKey;
    
    ReadMode 4;    # Turn off controls keys
    my $key;
    
    while ( !defined( $key = ReadKey(-1) ) ) {
        print "No key yet\n";
        sleep 5;
    }
    print "Get key $key\n";
    
    ReadMode 0;    # Reset tty mode before exiting
    

    【讨论】:

    • 感谢您尝试了提供的代码,并且输出每 5 秒持续发布一次“No Key Yet”,即使我按下任意键,输出也会一直循环显示“No Key Yet”,并且不会跳到下一节。似乎它没有检测到击键。
    • 当我运行这段代码时,它进入循环并在我按下一个键后退出它。正如预期的那样。你用的是哪个perl?我在 Ubuntu 13.04 64bit 上的 Perl 5.14 上对此进行了测试
    • 我也在使用 Windows,如果有帮助,请尝试从 HTML 页面获取击键。
    • Perl 5.8.7 在 UNIX 环境中,但通过 Windows (IE) 调用 CGI/HTML 脚本。
    • 所以您正在编写一个 Web 应用程序?我使用了命令行。在windows cmd中试试。但我不认为 Term::Readkey 适合来自 CGI 的输入。在您的 HTML 页面上尝试使用 javascript 进行类似的操作。如果未按下任何键,则使用预定义的参数发送请求。
    【解决方案2】:

    这里有一些代码:

    use Term::ReadKey;
    
    ReadMode(4);
    my $key;
    my $wait = 20;
    
    for (my $x = 0; $x < $wait; $x++) {
    if (defined ($key = ReadKey(-1))) {
            print "key pressed\n";
            break;
        }
        print "waiting for key press\n";
        sleep(1);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-01
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-25
      • 1970-01-01
      相关资源
      最近更新 更多