【问题标题】:decrease value of variable with time随时间减小变量的值
【发布时间】:2012-06-29 05:10:03
【问题描述】:

我想用 perl 编写一个脚本,为变量“10”定义一个值。 然后,它将要求用户通过标准输入输入该变量的值。 如果用户在固定的 TIME INTERVAL 内输入值,则采用该值,否则采用默认值 10 继续程序。

我不知道该怎么做。我想到了这样的事情。。 $t=120(120 秒) 如果用户输入某个值,则每秒减少“$t”的值 然后退出循环,继续,否则当 $t 变为 0 时,取默认值并继续。 但是,我不知道如何随着时间的推移减少变量的值以及询问用户的输入。

我可以做到这一点,随着时间减少变量的值,但在此期间,我无法接受输入。

【问题讨论】:

标签: perl


【解决方案1】:

这是一个简单的示例,说明如何使用警报信号进行操作。

use strict;
use warnings;

my $input = eval {
    my $tmp;

    # this sub will be called after the timeout set by the alarm below
    local $SIG{ALRM} = sub {
        print "timeout - using default value 10\n";
        $tmp = 10;
    };

    print "enter input: ";
    alarm 10;    # wait for 10 secs
    $tmp = <>;
    alarm 0;     # turn off alarm if we got input within 10 secs
    $tmp;
};

print "the value is: $input\n";

【讨论】:

  • 为什么需要评估?没什么die()s.
  • 确实如此;我猜写警报时只是习惯的力量。
  • 这不太行。 Perl 将重新启动被中断的读取,这意味着即使在alarm() 触发之后也需要一行输入来推进执行。 (我怀疑你 evald 这个“出于习惯”的原因是因为一种正确的技术是在 ALRM 处理程序中使用 die,避免重新启动。)如果你将 $tmp 设置为你的ALRM 处理程序(例如,$tmp = "timeout"),您会发现这种技术根本不起作用。它似乎与数字赋值一起工作的原因是因为thorny bug
【解决方案2】:

也可以使用 IO::Select

完成此操作
use strict;
use IO::Select;

my $value = 10;
my $obj = IO::Select->new(\*STDIN);
foreach my $hand ($obj->can_read(2)) {
    $value = <$hand> ;
}
print "value is :$value:\n" ;

【讨论】:

    【解决方案3】:

    我想你正在寻找Prompt::Timeout

    【讨论】:

      猜你喜欢
      • 2022-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-21
      相关资源
      最近更新 更多