[英]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.