如何在perl脚本中使用IPC :: Run模块

时间:2014-12-26 06:03:09

标签: oracle perl solaris sqlplus

我有这个Perl脚本连接到sqlplus数据库并运行以下命令。

my $SQLPLUS='/opt/oracle/product/11g/db_1/bin/sqlplus -S system/coolman7@vsdb';
`$SQLPLUS \@${basePath}/VoucherQuery1.sql $startdate> ${basePath}/QueryResult1.txt`;

现在我试图通过IPC :: Run运行第二个命令。我在很多方面都尝试过没有任何成功。像

open (WFH1, ">", "${basePath}/QueryResult4.txt");
run('$SQLPLUS \@${basePath}/VoucherQuery4.sql $startdate', '>', \\WFH1);
close(WH1);

但它无法连接到sqlplus或写入输出文件。我在谷歌和其他论坛搜索过但没有得到任何解决方案。请帮忙。 :)

1 个答案:

答案 0 :(得分:3)

使用词法文件句柄可以让生活变得更加轻松。它们不是全局的,当它们超出范围时它们会自动关闭。

open (my $wfh1, ">", "${basePath}/QueryResult4.txt");

整个问题可能是open失败了,你没有检查它是否成功。你可以用两种方法做到这一点。首先是手工完成......

my $query_result_file = "${basePath}/QueryResult4.txt";
open (my $wfh1, ">", $query_result_file)
    or die "Couldn't open $query_result_file for writing: $!";

或者您可以使用autodie为您执行此操作。

use autodie;
open (my $wfh1, ">", "${basePath}/QueryResult4.txt");

但您根本不需要手动打开文件,如果您传递文件名,IPC :: Run会为您执行此操作。

下一个问题是您传递给run的问题。它是单引号,这意味着不会插入任何变量。你真的试图运行$SQLPLUS @${basePath}/VoucherQuery4.sql $startdate。你需要双引号。

但最好将命令和参数作为数组引用传递,这样IPC :: Run将为你处理shell引用。

这是一个使用cat读取文件,添加行号并将结果输出到文件的简单示例。

use IPC::Run qw(run);
run ["cat", "-n"], "<", "/etc/passwd", ">", "test.out";

全部放在一起......

my $SQLPLUS_EXE = '/opt/oracle/product/11g/db_1/bin/sqlplus';
my $SQLPLUS_DB  = 'system/coolman7@vsdb';
my @SQLPLUS_CMD = ($SQLPLUS_EXE, '-S', $SQLPLUS_DB);

run [@SQLPLUS_CMD, "\@${basePath}/VoucherQuery4.sql", $startdate],
    ">", "${basePath}/QueryResult4.txt";