Я помню, что у меня была проблема с методом DBI selectrow_array
. Когда я был недостаточно аккуратен, я получил от него не значение столбца, которое я просил, а количество столбцов (или что-то нежелательное, я не могу точно вспомнить). Теперь я пытаюсь реорганизовать некоторый код и хочу убедиться, что во всех возможных местах я верну только ожидаемое значение. Поэтому я стараюсь избегать сюрпризов и выяснять, в чем было плохое поведение. Из документации DBI я прочитал, что это может быть действительно проблемная ситуация:
Если вызывается в скалярном контексте для дескриптора оператора, который имеет более одного столбца, не определено, вернет ли драйвер значение первого столбца или последнего. Так что не делай этого. Кроме того, в скалярном контексте возвращается undef, если строк больше нет или произошла ошибка. Это «undef» нельзя отличить от возвращаемого «undef», потому что первое значение поля было NULL. По этим причинам вам следует проявлять осторожность, если вы используете "selectrow_array" в скалярном контексте или просто не делаете этого.
Тем не менее я не могу заставить selectrow_array
вернуть что-либо, кроме значения col1
(это то, что я ожидаю)
my $query = 'SELECT col1, col2, col3 FROM table WHERE id = 112233';
my ( $c ) = ( $dbh->selectrow_array( $query ) );
my $x = ask_from_db();
my $y = $dbh->selectrow_array( $query );
my $z = ( $dbh->selectrow_array( $query ) );
my @A = $dbh->selectrow_array( $query );
say "C: $c"; # C: col1
say "X: $x"; # X: col1
say "Y: $y"; # Y: col1
say "Z: $z"; # Z: col1
say "A: @A"; # A: col1 col2 col3
sub ask_from_db {
return $dbh->selectrow_array( $query );
}
Каждый способ, о котором я прошу выше, дает мне прекрасный результат. Как мне запустить запрос, чтобы получить неверный результат?
неверный результат! = col1
значение
my $foo =()= $dbh->selectrow_array($query)
. Но кто на самом деле запрограммировал бы это непреднамеренно? Писать это случайно - все равно что случайно упасть на mp3-плеер и застрять где-нибудь в темноте и тепле ... - person simbabque   schedule 23.11.2012$foo
количество столбцов, а не значение для первого столбца. - person ikegami   schedule 24.11.2012$foo
. Это не заставляет его возвращать что-то, кроме первого элемента. - person ikegami   schedule 24.11.2012