脚本在提示时冻结

时间:2014-08-17 14:20:48

标签: perl prompt

我正在研究预测疾病结果的模型,并且在我开始尝试创建用户提示之前一直工作。代码在"持续时间停止"提示,位于此代码块的底部。该脚本似乎冻结(闪烁光标)并且没有任何地方,但是处理器使用率为100%,因此它正在做某事。我尝试打印文本,它似乎停止在#34;持续时间"提示。如果您想尝试自己运行,则整个代码都在GitHub上。

我已经看了很多次,并且在任何地方都看不到任何错误,我希望一些新鲜的眼睛可以看到一些东西。我确定我在某个地方犯了一个愚蠢的错误。非常感谢!

编辑:如果我删除所有代码"我的%人口,"它有效。

#!/usr/bin/perl

use 5.10.1;
#use strict;
use warnings;
use Data::Dumper;
use Storable qw(dclone);

print "Enter number of individuals: ";
my $NUM_IND = <STDIN>;
exit 0 if ($NUM_IND eq "");

print "Enter initial number of infections: ";
my $INIT = <STDIN>;
exit 0 if ($INIT eq "");

print "Enter number contacts per individual: ";
my $CONTACT_RATE = <STDIN>;
exit 0 if ($CONTACT_RATE eq "");

print "Enter disease infectious period: ";
my $INFECTIOUS_PERIOD = <STDIN>;
exit 0 if ($INFECTIOUS_PERIOD eq "");

print "Enter disease virulence: ";
my $INFECTIVITY = <STDIN>;
exit 0 if ($INFECTIVITY eq "");

print "Enter disease incubation period: ";
my $INCUB = <STDIN>;
exit 0 if ($INCUB eq "");

print "Enter number of vaccinations per day: ";
my $VAC = <STDIN>;

print "Enter vaccine efficacy: ";
my $EF = <STDIN>;

print "Enter duration of model: ";
my $DURATION = <STDIN>;
exit 0 if ($DURATION eq "");
print "this works";

my %population = ();

1 个答案:

答案 0 :(得分:2)

请永远注释掉use strict。它可能比首先不包括它更糟糕。 strict对于查找程序中的错误是一个巨大的帮助,应该被接受,而不是避免。

您没有看到this works的原因是因为没有刷新输出缓冲区。如果你添加

STDOUT->autoflush;

位于程序的顶部(例如,在use语句之后),它将强制在每个print语句后刷新缓冲区,您将看到您的文本。

真正的问题是这一行

for (my $i = 0 ; $i = $INIT ; $i++) {

您的条件是分配 $i = $INIT,只要$INIT非零,该条件始终为真。

我假设你想要$i < $INIT,就像其他循环一样。

但是使用Perl的范围运算符会更好,这更容易阅读并且不容易受到这样的错误的影响。只需使用

for my $i (0 .. $INIT-1) { ... }

并且很明显发生了什么。