重新运行时,修改的Perl脚本不输出更改,仅显示以前的结果

时间:2013-07-25 23:58:49

标签: perl

我有一个从UNIX命令提示符运行的Perl脚本。该脚本询问几个用户输入,其中一个是用于从中收集特定数据的ASCII文档。然后,脚本读取文档并对文档执行多次检查,然后将特定数据输出到另一个文件。

我遇到的问题是,如果我更新脚本,例如添加 - print“printprintprint \ n \ n”;在while()循环中,更新“printprintprint”不会显示在UNIX窗口中,然后下次运行脚本时。此循环或任何更改生效的唯一方法是重命名脚本或将脚本移动到另一个目录。如果我将脚本重命名为原始名称,即使我对脚本进行了更多更改,也会发生原始输出,并且不会出现“printprintprint”。 我将尝试提供一个简单的例子: 脚本名称:doc_rpt.pl

my $action;
use strict;
use warnings;
while (<Infile>)
{
print “Perform action (Yes or No)?: “;
$action = <STDIN>;
chomp ($action);
    if (lc($action) ne “yes")
      {
        if (lc($action) ne “y”)
        {$action = “No”;}
        else
        {$action = “Yes”;}
       }
    else
        {$action = “Yes”;}
print “Result:  $action”;
}
close Infile;

如果我要运行脚本并回答“是”,屏幕上显示的结果将为“是”。 现在,如果我要添加print “printprintprint\n\n”;

my $action;
use strict;
use warnings;
while (<Infile>)
{
print “Perform action (Yes or No)?: “;
$action = <STDIN>;
        chomp ($action);
 print “printprintprint\n\n”;
    if (lc($action) ne “yes)
    {
        print “printprintprint\n\n”;
          if (lc($action) ne “y”)
          {
               print “printprintprint\n\n”;
               $action = “No”;
          }
        else
        {
              print “printprintprint\n\n”;
              $action = “Yes”;}
        }
    else
      {
          print “printprintprint\n\n”;
          $action = “Yes”;
      }
print “Result:  $action”;
}
close Infile;

保存更改后,如果我再次运行脚本,无论我创建多少,我都不会在UNIX屏幕上看到“printprintprint”。我必须重命名脚本(例如从doc_rpt.pl到doc_rpt_v2.pl)才能使更改生效。 if / else动作或循环中的任何其他动作也是如此。我每次都要输入“是”。除非重命名脚本,否则“是”或“y”将导致“否”值。将脚本重命名为之前未使用的名称后,脚本将正常运行,直到我再次进行更改。然后整个过程重复。

看起来脚本读取的原始脚本和信息将保留在缓冲区中,并且不会被清空或覆盖。如果是这种情况,我该如何清空缓冲区?我确实有Close Outfile和Close Infile。我应该使用$ |或类似的东西清空缓存?在“关闭Infile”之后缺乏退出是否是一个原因?

1 个答案:

答案 0 :(得分:2)

如果doc_rpt.pl生成旧版脚本的输出,但./doc_rpt.pl的输出反映了您的更改,并将脚本重命名为doc_rpt2.pl并以该名称运行也反映了你的变化,然后发生的是:

  • 您的$PATH值(echo $PATH要查看它)包含.,即当前目录。出于某种历史安全原因,不建议在多用户系统上使用,但在现代实践中不太可能有害;另一方面,它会产生相当混乱的行为,正如你正在迅速发现的那样。
  • $PATH .之前的某个时刻,有一个目录,其中包含doc_rpt.pl的副本,在该名称下,并且没有您正在进行的更改
  • 当您仅通过其名称doc_rpt.pl运行脚本时,shell会在$PATH中列出的目录中查找该名称的可执行文件。当它找到旧版本的脚本时,它会停止查找并运行该版本。
  • 当您使用路径(即./doc_rpt.pl)限定运行脚本时,shell不会执行$PATH查找;你已经告诉它“运行我当前工作目录中存在的可执行文件doc_rpt.pl,这就是它的作用,这就是为什么当你这样做时你会看到你最近的变化。
  • 同样,当您将脚本重命名为doc_rpt2.pl并以此方式运行时,$PATH查找会继续,直到它到达您当前的目录,然后它会找到您已经给出其名称的可执行文件,并运行它。

解决问题的最简单方法是在每种情况下以./doc_rpt.pl运行脚本的工作版本;如果在$PATH的其他地方有副本,那可能是有原因的。