簡體   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