Проблема разыменования массива Perl с DBI :: fetchall_arrayref - PullRequest
1 голос
/ 23 июня 2011

Я новичок в Perl, и у меня возникли проблемы с разыменованием массива, который является результатом fetchall_arrayref в модуле DBI:

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 ]

8 голосов
/ 23 июня 2011

Из doc

Метод fetchall_arrayref может использоваться для извлечения всех данных, которые должны быть возвращены из подготовленного и выполненного дескриптора оператора. Возвращает ссылку на массив, который содержит одну ссылку на строку .

Так что в вашем примере $teacher является ссылкой ARRAY.Так что вам нужно будет перебрать этот массив ref

foreach my $teacher (@{$teachers}) {
    foreach my $titem (@$teacher) {
        print $titem;
    }
}
7 голосов
/ 23 июня 2011

, если вы хотите извлечь только столбец учителя, вы хотите использовать:

my @teachers = @{$dbh->selectcol_arrayref($sql)};
5 голосов
/ 23 июня 2011

У вас есть ссылка на массив строк.Каждая строка является ссылкой на массив полей.

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

Вы бы увидели разницу с Data :: Dumper .

use Data::Dumper;
print(Dumper($teachers));
print(Dumper($arrref));
5 голосов
/ 23 июня 2011

fetchall_arrayref извлекает все результаты запроса, поэтому в действительности вы получаете ссылку на массив массивов Каждая возвращаемая строка будет arrayref из столбцов. Поскольку ваш запрос имеет только один столбец, вы можете сказать:

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

чтобы получить то, что вы хотите.

Подробнее:

Массивы массивов в Perl .

3 голосов
/ 23 июня 2011

$sth->fetchall_arrayref возвращает ссылку на массив, который содержит одну ссылку на строку!
Взгляните на документы DBI здесь .

1 голос
/ 23 июня 2011

Согласно документации fetchall_arrayref () * 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}) {
    local $" = ', ';
    print "@{$teacher}\n";
}

Структура данных может быть немного сложнавизуализировать иногда.Когда это происходит, я прибегаю к Data::Dumper, чтобы вставить следующие строки:

print Dumper $teacher;

Я обнаружил, что иногда, выгружая структуру данных, я получаю мгновенную карту для использования в качестве контрольной точки, когдасоздание кода для управления структурой.Недавно я работал над настоящим кошмаром строения, просто используя Dumper время от времени, чтобы выпрямить голову.

0 голосов
/ 27 июля 2013

Вы можете использовать карту для разыменования возвращаемой структуры:

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

Теперь у вас есть простой набор учителей.

...