質問: ([$work[0],$work[1],$work[2],]); #以下に変更 push @result, [@work]; } #//■close $sth->finish; $db->disconnect; for($i=0; $i<$cnt; $i++){ print "".$result[$i][0]."/".$result[$i][1]."/".$result[$i][2]."\n"; } ********************************************************** ■表示 1/1/aaa 1/2/bbb 1/3/ccc
回答: こんにちは、 >******************************************* >◆[2]リファレンスを代入した場合 >for($i=0; $i<$sth->rows; $i++){ >@work = $sth->fetchrow_array; >$result[$i] = \@work; >} >※0.002~0.004秒(10件)0.4~0.5秒(50件) >******************************************* これの @result には期待した結果が得られなかったんじゃないですか? @result の各要素に格納されたのは全部同じ @work へのリファレンスになる気がします my @work = $sth->fetchrow_array; でレキシカル宣言すれば、それぞれ違う @work へのリファレンスになり期待した結果になると思います。 (検証してませんので違ったらすみません。) >もともと[3]のやり方は随所で「メモリーを大量に消費するので非推奨」 >******************************************* >◆[3]一度に全部のデータを取得した場合 >$ref = $sth->fetchall_arrayref; >@result = @$ref; >※0.002~0.004秒(10件)0.5~0.6秒(50件) >******************************************* 確かにこれはそうだと思い、(一応)とつけて書きました。 ですが、どの方法でも最終的に全てのデータを @result に格納するつもりなら、 結局メモリは使っちゃいますよね。 なら、 >@result = @$ref; こういった形でコピーせずに、取得したリファレンスを直接使えば、 fetchall_arrayref でも良いと思いますけど。 データの数を制限するなら、 sqlを書くときにそうなるように書くか(その方法は知りません) my @recs = (); while ( my $rec_ref = $sth->fetchrow_arrayref ){ push @recs , $rec_ref; last if scalar @recs > 100; } みたいにするかですかね >配列に格納すること自体をあまりしないのかもしれないですね。 まあ、表示するだけなら、配列にバッファしたりしないで、 一つずつ処理した方が良いのかも知れませんが、 そうもいかない場合もあるでしょうね、 まあ、大きいデータだと分かっているなら、 不用意にコピーせずに、リファレンスをうまく使うのが良いかもですね。 まあ、私は一般人(謙遜じゃありません)なので、参考程度で。