在Windows 10上尝试执行perl脚本时出现Open2/Open3.pm perl问题

在Windows 10上尝试执行perl脚本时出现Open2/Open3.pm perl问题,perl,oracle11g,windows-10,Perl,Oracle11g,Windows 10,我正在尝试执行一个perl脚本来更新远程数据库中的值。此perl脚本在Windows 7上执行良好,但在Windows 10上失败。 调用脚本的perl exe已包含在Oracle 11g 64位的安装中。 Windows 10上出现的具体错误如下: open2:无法在C:/oracle/product/11.2.0/client_64/perl/lib/IPC/Open3.pm第365行对未定义的值调用方法close 脚本摘录如下: open2 ($RPIPE, $WPIPE, 'sqlplu

我正在尝试执行一个perl脚本来更新远程数据库中的值。此perl脚本在Windows 7上执行良好,但在Windows 10上失败。 调用脚本的perl exe已包含在Oracle 11g 64位的安装中。 Windows 10上出现的具体错误如下:

open2:无法在C:/oracle/product/11.2.0/client_64/perl/lib/IPC/Open3.pm第365行对未定义的值调用方法close

脚本摘录如下:

open2 ($RPIPE, $WPIPE, 'sqlplus -s /nolog') or die "\n";

unless ($pid = fork()) {
    print $WPIPE "set hea off\n\n";
    print $WPIPE "conn sys\/".$psys_pass."\@".$pdbname." as sysdba\n\n";
    print $WPIPE "from dba_users\n";
    print $WPIPE "where username in \(select grantee from dba_role_privs where granted_role=\'COMPONENT_OWNER\' and admin_option=\'NO\'\)\;\n";
    print $WPIPE "exit\n";
    close $WPIPE;
    exit 0;
}

close $WPIPE;
@pdbcmds=();
while(<$RPIPE>) { if    ($_ =~ /^alter user/ ) { push (@pdbcmds, $_); }
        }
close $RPIPE;
waitpid ($pid,0);

好吧,如果我们能看到脚本就好了,但是看起来你正在试图关闭一些未定义的东西…我现在添加了脚本的其余部分好吧,再次,你正在做close$WPIPE;在循环中,然后在循环之后,有意义吗?因此,脚本在循环外部抱怨close命令,因为您已经在循环内部关闭了它。拆除封闭管道;在循环内部,在退出0之前;您不应该使用IPC::Open2/3。他们的水平太低了。首先,编写死锁代码太容易了。例如,您的代码就是此类错误代码的一个示例。IPC::Run是一个更好的模块。好吧,如果我们能看到脚本就好了,但是看起来你正在试图关闭一些未定义的东西…我现在添加了脚本的其余部分好吧,再次,你正在做close$WPIPE;在循环中,然后在循环之后,有意义吗?因此,脚本在循环外部抱怨close命令,因为您已经在循环内部关闭了它。拆除封闭管道;在循环内部,在退出0之前;您不应该使用IPC::Open2/3。他们的水平太低了。首先,编写死锁代码太容易了。例如,您的代码就是此类错误代码的一个示例。IPC::Run是一个更好的模块。