2013-10-09 47 views
1

我想從數據庫訪問數據並將數據複製到一個數組。這是我的代碼,如何將數據複製到perl中的數組?

$sth = $dbh->prepare("SELECT * FROM abcd WHERE id=100 "); 
$sth->execute; 
$N=$sth->rows; 
print "$N\n"; 
while (my @row_val = $sth->fetchrow_array()){ 
    my ($uniqid, $time, $current, $id) = @row_val; 
    $y[k]=$current; 
    $k++; 
} 
for ($k=0;$k<$N;$k++) { 
    print "$y[k]\t"; 
} 

但它顯示所有$ y [k]相同的值。如何將數據庫中的數據複製到perl中的數組?

+0

$ Y [K]顯然是一個語法錯誤。在發佈問題之前確保您的代碼正常工作,否則很難診斷。 –

+0

@RichardHuxton代碼正在爲我工​​作,沒有任何錯誤。我知道我的代碼是錯誤的!所以想要你們的幫助! – no1

+1

@RichardHuxton這不是一個語法錯誤,這是一個純粹的錯誤。語法是有效的,並且沒有打開警告,錯誤是無聲的。 – TLP

回答

6

您使用這裏裸詞:

$y[k]=$current; 
# ^--- here, the "k" is a bareword 

如果use warnings這將給予警告

Unquoted string "k" may clash with future reserved word at foo.pl line 10. 
Argument "k" isn't numeric in array element at foo.pl line 10. 

而「K」將被解釋爲一個字符串,將被轉換爲一個號碼將爲零0,因此您的所有數據都存儲在$y[0]中。

這就是爲什麼不轉向警告是一個非常糟糕的主意。

你可能就要什麼是推動新值到數組:

push @y, $current; 

這是,海事組織,最好使用索引,因爲它所有的工作適合你。通常,如果索引本身對您有價值,比如比較數組元素時,您只想專門涉及數組索引。

這也意味着你以後的for循環

for ($k=0;$k<$N;$k++) { 
    print "$y[k]\t"; 
} 

更好書面

for (@y) { 
    print "$_\t"; 
} 

雖然這是更好地與join寫:

print join "\t", @y; 

最後一點,你應該始終使用

use strict; 
use warnings; 

使用這些編譯指示時,需要少量的學習來克服額外的噪音,但它在學習和減少調試時間方面非常值得。我通常會說,不使用這些編譯指示就像是在車內掩蓋低油警告燈:不知道錯誤並不能解決問題。

+0

謝謝......現在工作正常.. :) – no1

+0

不客氣。 – TLP

3

這種行爲是因爲你把所有的東西都放到索引「k」 - 不是任何數字只是「k」,
它只是一個巧合,它的工作原理:) - 「相同值」是最後一個值 - 不是嗎? :)

SOLUTION:

1)變量與$寫 - 訪問$yourArray[$variableWithIndex]

2)$y[k]=$current;#錯時記住這一點!您嘗試訪問 「K」 指數 正確:$y[$k]=$current;

Didnt測試它 - 但這應該工作:

$sth = $dbh->prepare("SELECT * FROM abcd WHERE id=100 "); 
$sth->execute; 
$N=$sth->rows; 
print "$N\n"; 
$k=0; # init first! 
while (my @row_val = $sth->fetchrow_array()){ 
    my ($uniqid, $time, $current, $id) = @row_val; 
    $y[$k]=$current; # dont forget the $ 
    $k++; 
} 
for ($k=0;$k<$N;$k++) { 
    print "$y[$k]\t"; # dont forget the $ 
} 
+1

謝謝...... :)現在工作正常.. :) – no1

相關問題