1

我有一个从 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”将导致“否”值。将脚本重命名为以前未使用的名称后,脚本将正常运行,直到我进行另一次更改。然后整个过程重复。

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

4

1 回答 1

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它可能是有原因的。

于 2013-07-26T17:31:58.180 回答