2012-10-11 15 views
1

我有Perl代碼如下所示:Perl mysql,爲什麼這個fetchrow_array不工作?

$pre = $dbh->prepare("select distinct skills from people"); 
$pre->execute; 

my @preList; 
while (my $row = $pre->fetchrow_array()) { 
    push (@preList,$row); 
} 
print "Pre list: $_" foreach @preList; 

當我嘗試在SQL它完美的作品完全一樣的語句,但是當我運行這個程序,它打印出什麼(這意味着一個空@preList)。我可能做的很愚蠢,但看不到它。我之前使用這種格式獲取數據,這非常完美。任何人都可以看到我做錯了什麼?

+0

你真的需要'錯誤處理' –

+0

@sputnick - 我們沒有看到連接,那裏可能有一個RaiseError,但我很懷疑。 – runrig

回答

7

現在你正在做的,fetchrow_array它返回一個列表,但你試圖將其存儲在一個標量,您可以將其更改爲fetchrow_arrayref或更改$row@row,或更改my $rowmy ($row)

+0

完美!使用'@ row'就像一個魅力。不過,我感到困惑,因爲我以前使用過這種確切的格式,並且它沒有使用@行。也許有一個列類型的區別或者什麼:/ – dgBP

+0

不,Perl不會返回標量上下文中的數組(實際上perl永遠不會返回數組,只有列表)。 @bladepanthera:看到我的答案可能的罪魁禍首 – ysth

+1

@ysth - 也許這取決於DBD。剛剛測試過w/DBD :: Oracle,並選擇一個列工作正常w /標量上下文。儘管如此,我不會依賴這一點,因爲文件警告它。 – runrig

0

您應該試着用fetchrow_arrayref代替fetchrow_array代碼。

2
$pre = $dbh->prepare("select distinct skills from people"); 
$pre->execute; 

my @preList; 
while (my $row = $pre->fetch()) { 
    push (@preList,$row); 
} 
foreach @preList{ 
    print "Pre list row: " . join(',',@$_); 
} 

或:

$pre = $dbh->prepare("select distinct skills from people"); 
$pre->execute; 

my $preList = $pre->fetchall_arrayref(); 

foreach @$preList{ 
    print "Pre list row: " . join(',',@$_); 
} 
4

當你說:

while (my $row = $pre->fetchrow_array()) { 

值從返回行,分爲$行,然後對真理進行測試。 一旦返回的技能值爲false,循環將終止,而不會將該值放入@preList中。如果第一行結果的技能是NULL或「」或「0」,您將看到您看到的結果。

更改爲:

while (my ($row) = $pre->fetchrow_array()) { 

(或使用@row,正如其他人所建議的),值仍然從返回的每一行,並分爲$行,但不是價值真理被測試,從fetchrow_array返回的元素的數量被測試爲true(並且當fetchrow_array用完結果行時返回一個空列表,所以這個數字對於結果的每一行是1,然後是0來終止循環)。發生這種情況是因爲while()需要一個標量來測試,所以給出賦值標量上下文,而在perl中,標量上下文中的列表賦值返回賦值右側的元素數,特別是這樣的代碼將會只是工作。