在cursor.pl第5行的模式匹配(m //)中使用未初始化的值$ _

时间:2018-08-09 14:18:02

标签: oracle perl

我在perl中有此脚本:

#!/usr/bin/perl 
use strict;
use warnings;
while () {
  if (/^PARSING IN CURSOR/../END OF STMT/) {
    if (/^PARSING IN CURSOR/) {
      s/^PARSING IN CURSOR \#//;
      s/ [a-z]+=/!/g;
      s/\n$/!/;
      $_="$.!$_";
    }
    unless (/^END OF STMT/) {
      print;
    }
  }
}

在llinux perl中执行时cursor.pl显示以下消息:在cursor.pl第5行的模式匹配(m //)中使用未初始化的值$ _。 该文件的作用是在oracle中将一个外部表加载到跟踪文件中,当我选择该表时,它不返回任何内容,并且仍在运行。

2 个答案:

答案 0 :(得分:4)

while () { ... }

描述了一个无限循环(被视为while (1) { ... }),这就是程序保持运行的原因。根据您脚本的其余部分,我想您想说的是

while (<>) { ... }

等效于

while (defined($_ = <ARGV>)) { ... }

在这种构造中,Perl从默认文件描述符中读取一行并将其分配给变量$_。当文件句柄用尽并且没有更多的输入要读取时,Perl将$_设置为未定义的值,然后循环结束。

答案 1 :(得分:0)

  

文件的作用是在oracle中将外部表加载到跟踪文件

不,不是。您的代码中没有文件IO

您的代码中没有任何内容可以将$_设置为定义的值,因此正则表达式模式匹配将生成此警告

while () { ... }只是一个不确定的循环,最有可能的目的是从命令行上指定的文件中读取。应该是

while ( <> ) {
    ...
}