2011-10-20 29 views
-1

需要一些幫助來構建我的Perl代碼。我有一部分工作在能夠從一個子例程$cmd->ls("$chkdir");中提取結果並從密鑰$dirnm->{path}(例如目錄:'/ home/mydir')中獲得結果的部分。在Perl中將值從一個子例程傳遞給另一個

我需要做的是,導致(「/家庭/ DIR」)到另一個子例程作爲輸入與SQL語句中的DBI連接(sub results_in

那麼,如何構建此,使通我可以將從一個子例程調用的值傳遞給另一個子例程?

示例代碼:

my $DirResults = $cmd->ls("$chkdir"); #$chkdir is directory passed as argument 
for my $dirnm (@{$DirResults->{directory}}) { 
    print "Directory: " . $dirnm->{path} . "\n"; 
} 

# 
### Database handle 
# 
my $dbh_oracle = DBI->connect(
     $CFG{oracle_dbi_connect}, 
     $CFG{db_user}, 
     $CFG{db_cred}, 
     {AutoCommit => 0, 
     RaiseError => 0, 
     PrintError => 0}) or die ("Cannot connect to the database: ".$DBI::errstr."\n"); 
my $res_in=results_in($dirnm->{path}); #Here for pseudo code 
$dbh_oracle->disconnect();  

sub results_in 
{ 
    my $sth= $dbh_oracle->prepare(q{ 
     INSERT into mydirs 
      VALUES (280, '$res_in')}) || 
     die ("Cannot connect to the database: ".$DBI::errstr."\n"); 
    $sth->execute; 
    $sth->finish; 
} 
+1

您的電話正確無誤。問題在於'$ dirnm'只存在於循環中。當循環只輸入一次時你很想做什麼,但是當循環從不輸入時你想要做什麼,以及當多次輸入循環時你想要做什麼? – ikegami

+0

我想插入一個'$ dirnm'給每個人,如果我有可能的話。如果'$ dirnm'有0個結果,則一起退出。我基本上想把我發現的任何結果輸入到這張表中。 – jdamae

回答

1

你只是忘記接收使用@_results_in()參數?例如: -

sub results_in 
{ 
    my ($dir) = @_; 
    my $sth= $dbh_oracle->prepare(qq{ 
     INSERT into mydirs 
      VALUES (280, '$dir', DEFAULT, 1700)}) || 
     die ("Cannot connect to the database: ".$DBI::errstr."\n"); 
    $sth->execute; 
    $sth->finish; 
} 

我錯過了什麼?

請注意,我也改變q{qq{使$dir將插值(與被插入的文本字符串'$dir'

+0

考慮遇到路徑'ikegami的文件'時會發生什麼。 – ikegami

6

您的電話是正確的。問題是$dirnm只存在於循環中,但您在循環之外使用它。您需要在連接打開點和關閉點之間移動循環。

同時,讓我們做一點清潔。您不想多於prepare;這是浪費。一個避免使用佔位符來做到這一點。

佔位符還可以讓您不必將路徑轉換爲SQL文字,您很難嘗試添加引號。這是注射缺陷/攻擊的祕訣。

所以我們最終有以下幾點:(處理去除錯誤讓事情變得簡短而中肯爲這個職位做保留或使用RaiseError=>1

my $dbh_oracle = DBI->connect(...); 

my $sth = $dbh_oracle->prepare(q{ 
    INSERT INTO mydirs VALUES (280, ?, DEFAULT, 1700) 
}); 

my $DirResults = $cmd->ls($chkdir); 
for my $dirnm (@{ $DirResults->{directory} }) { 
    $sth->execute($dirnm->{path}); 
} 

$sth->finish(); 
$dbh_oracle->disconnect(); 

有真沒有任何一點子(除了execute),所以我沒有使用一個。但是,由於您特意詢問了有關子電話的情況,因此以下說明了子電話的代碼可能如何:

sub results_in { 
    my ($sth, $path) = @_; 
    $sth->execute($path); 
} 

... 
my $DirResults = $cmd->ls($chkdir); 
for my $dirnm (@{$DirResults->{directory}}) { 
    results_in($sth, $dirnm->{path}); 
} 
... 
+0

謝謝你看這個。我會在沒有調用另一個子程序的情況下進行操作,但是我很感謝您添加插圖以供參考。 – jdamae

相關問題