Wszelkie pytania tego typu powinny być poprzedzone „Nie mogę używać DBI ponieważ ... "Ponieważ naprawdę chcesz korzystać z DBI, jeśli w ogóle jest to możliwe. Możesz mieć dobry powód, aby go nie używać, ale być może, możemy powiedzieć, dlaczego twoje powody nie są zbyt dobre i co z tym zrobić. Biorąc to pod uwagę, oto jeden ze sposobów, aby wykonać to, o co prosiłeś, używając uchwytów fork i file, a także uzyskać wydruk po jednej linii naraz (ostrzeżenie: jeśli za dużo wydrukujesz taki proces, może on zostać zablokowany z powodu problemów z buforem):
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;
Zastanawiam się również nad napisaniem skryptu powłoki i zwróceniem wyniku zapytania i chcę wywołać ten skrypt powłoki wewnątrz skryptu perl.is który jest również możliwy? – Vijay
na pewno - wszystko w backtickach lub qx() będzie uruchamiane jako podsieć, a wyjście wychwycone w podobny sposób. Po raz kolejny nie sądzę, że jest to bardzo dobry sposób na zorganizowanie programu perl. – cms
To jest wspaniałe wykorzystanie mechanizmu cytowania qx, a w jednorazowych scenariuszach skryptów może to być przyjemny sposób. –