2011-06-22 112 views
1

我是一個Perl的新手,因與訪問一個數組是DBI模塊中fetchall_arrayref的結果問題:Perl數組取消引用問題的DBI :: fetchall_arrayref

my $sql = "SELECT DISTINCT home_room FROM $classlist"; 
my $sth = $dbh->prepare($sql); 
$sth->execute; 
my $teachers = $sth->fetchall_arrayref; 
foreach my $teacher (@{$teachers}) { 
    print $teacher; 
} 

運行,這將打印參考而不是數組中的值。

然而,當我運行:

my $arrref = [1,2,4,5]; 
foreach (@{$arrref}) { 
print "$_\n"; 
} 

我得到的數組的值。

我在做什麼錯?感謝您的幫助!

傑夫

回答

7

,如果你想只提取老師列,您要使用:

my @teachers = @{$dbh->selectcol_arrayref($sql)}; 
8

doc

的fetchall_arrayref方法可以是用於獲取所有的數據是 從一個準備返回,並執行 語句句柄。 它返回一個 引用數組,其中包含 每行一個引用。

所以在你的例子中,$teacher是ARRAY參考。 所以,你需要遍歷這個數組引用

foreach my $teacher (@{$teachers}) { 
    foreach my $titem (@$teacher) { 
     print $titem; 
    } 
} 
3

$sth->fetchall_arrayref返回到包含每行一個參考數組的引用!
查看DBI文檔here

5

fetchall_arrayref提取全部查詢的結果,所以你實際回來的是對數組數組的引用。返回的每一行都是列的arrayref。由於你的查詢只有一列,你可以這樣說:

my $teachers = $sth->fetchall_arrayref; 
foreach my $teacher (@{$teachers}) { 
    print $teacher->[0]; 
} 

得到你想要的。

查看更多:

Arrays of arrays in Perl

1

每的DBI's fetchall_arrayref()文檔:

的fetchall_arrayref方法可以是 用來獲取所有的數據是 從一個準備返回,並執行 語句句柄。它返回一個 引用,該引用包含每行一個引用的 。

你離開一個間接層:

my $sql = "SELECT DISTINCT home_room FROM $classlist"; 
my $sth = $dbh->prepare($sql); 
$sth->execute; 
my $teachers = $sth->fetchall_arrayref; 
foreach my $teacher (@{$teachers}) { 
    local $" = ', '; 
    print "@{$teacher}\n"; 
} 

的數據結構可能會有點辛苦,有時想象。當發生這種情況我訴諸Data::Dumper,這樣我可以插入線這樣的:

print Dumper $teacher; 

我發現有時傾銷數據結構我得到即時的地圖爲參考點創建代碼時使用操作結構。我最近剛剛通過使用Dumper來一次結構的真正噩夢來整理我的頭。

5

你要行的數組的引用。每一行都是對一組字段的引用。

foreach my $teacher_row (@$teachers) { 
    my ($home_room) = @$teacher_row; 
    print $home_room; 
} 

你會看到與Data::Dumper的區別。

use Data::Dumper; 
print(Dumper($teachers)); 
print(Dumper($arrref)); 
0

您可以使用地圖取消引用返回的結構:

@teachers = map { @$_->[0] } @$teachers; 

現在你有教師的簡單數組。

+0

我應該提到$ _之前的@會在更高版本的perl中引起「棄用」警告。只要將其刪除即可安靜。 – paz9