繁体   English   中英

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

[英]How to use IPC::Run module in perl script

我有这个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或写入输出文件。 我在谷歌和其他论坛搜索过但没有得到任何解决方案。 请帮忙。 :)

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

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";

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM