此類型的任何問題應以「我不能使用DBI因爲被開頭... 「因爲你真的想盡可能使用DBI。你可能有充分的理由不使用它,但也許,我們可以告訴你爲什麼你的理由不是很好,以及如何處理它。也就是說,這裏有一種方法可以使用fork和filehandles來完成你所要求的操作,並且一次獲得一行代碼(警告:如果你對這樣的進程打印太多,可能因爲緩衝區問題而阻塞):
use strict;
use warnings;
pipe(my($p_rdr, $c_wtr)) or die "Err: $!";
pipe(my($c_rdr, $p_wtr)) or die "Err: $!";
my $pid = fork;
die "Could not fork: $!" unless defined $pid;
unless ($pid) {
close $p_rdr;
close $p_wtr;
open(STDOUT, ">&=", $c_wtr) or die "dup: $!";
open(STDIN, "<&=", $c_rdr) or die "dup: $!";
print "Exec sqlplus\n";
exec qw(sqlplus user/[email protected]);
die "Could not exec: $!";
}
close $c_wtr;
close $c_rdr;
print "Print sql\n";
print $p_wtr "select * from table_name where col1 = 'something';\n";
print "Close fh\n";
close $p_wtr;
print "Read results\n";
while (<$p_rdr>) {
print "O: $_";
}
close $p_rdr;
我也想寫一個shell腳本並返回quesry輸出結果,我想調用perl script.is中的那個shell腳本也是可能的? – Vijay 2009-11-13 09:38:40
確定 - 反引號或qx()中的任何內容都將作爲子外殼運行,並且輸出的捕獲類似。再一次,我不認爲這是構建perl程序的非常好的方式。 – cms 2009-11-13 10:47:15
這是qx引用機制的神話般的用法,並且在一次性腳本方案中,這可能是一個不錯的方法。 – 2009-11-13 16:55:09