2017-12-28 64 views
0

DBIselectall_arrayを使用して、mysqlからすべてのデータを取得します。私のクエリはすべての行に対して1つの列を返します。しかしselectall_array関数Perl selectall_array - 配列の配列からすべてのデータを取得する

$VAR1 = [ 
      '1.ptmp' 
     ]; 
$VAR2 = [ 
      'e1.ptmp' 
     ]; 
$VAR3 = [ 
      's2.ptmp' 
     ]; 
$VAR4 = [ 
      'sw1.ptmp' 
     ]; 
$VAR5 = [ 
      'w1.ptmp' 
     ]; 

下記の通り私はたい何行ごとに配列リファレンスの配列を返すが、単一のアレイ(NO参考文献)にすべてのドメインを抽出する方法であるか、または存在しDBI機能います参照せずにデータの完全な配列を返しますか?私はすべてのデータをループするか、whileループでfetchrow_arrayを実行したくない。可能であれば、それをすべて行うための単一のステートメントを探していますか?

以下の私のコードを参照してください。

my @mysqldata = $dbh->selectall_array('SELECT `domain` FROM dfs WHERE `id` IN ('.join(',',('?')x(scalar(@params))).')', {}, @params); 
my @minus = array_minus(@all, @mysqldata); 

答えて

1

をあなたはこのような1行で一つの大きな配列への配列リファレンスを参照解除することができます

my @all = map {@$_} $dbh->selectall_array($sql); 

mapブロックがselectall_arrayによって返された各行に@$_を適用これは配列参照を逆参照します。

+0

ありがとうございます。これはうまくいきます: –

3

1列だけを抽出するので、selectcol_arrayref()メソッドを試すことができます。つまり、配列をインラインで参照解除します。

my @mysqldata = @{ $dbh->selectcol_arrayref('SELECT `domain` FROM dfs WHERE `id` IN ('.join(',',('?')x(scalar(@params))).')', {}, @params) }; 

UPDATE

ysthはコメントで示唆したように、あなたはselectcol_arrayref()によって返された値を間接参照にはPerl(後v5.20.0と)の新しいバージョンで後置演算子を使用することができます - のように以下。

$dbh->selectcol_arrayref('SELECT domain FROM dfs', undef, @params)->@*; 
+2

または、後置参照: '$ dbh-> selectcol_arrayref(...) - > @ *;'。または、参照としてそのまま使用してください。 – ysth

+0

Postfixの参照解除は素晴らしい新機能ですが、実験的に 'v5.20'でのみ利用可能になり、' v5.24'から安定しています。 – beasy

+0

@ysth:ありがとう。私はあなたの提案を含めるために私の答えを更新しました。 –

関連する問題