2017-12-28 59 views
0

DBIselectall_array을 사용하여 mysql에서 모든 데이터를 가져옵니다. 내 쿼리는 모든 행에 대해 1 개의 열을 반환합니다. 내가하고 싶은 것은 모든 하나의 배열에 도메인 (NO 심판) 또는 추출하는 방법입니다Perl selectall_array - 배열 참조의 배열에서 모든 데이터를 검색합니다.

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

아래에 나열된 그러나 selectall_array 함수는 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

할 수 있습니다 역 참조 같은 한 줄에 하나 개의 큰 배열에 arrayrefs :

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

map 블록 selectall_array에 의해 반환 된 각 행에 @$_ 적용 배열 참조를 역 참조합니다.

+0

감사합니다. 이것은 작동합니다 :) –

3

하나의 열만 추출하므로 selectcol_arrayref() 메서드를 사용해보십시오. 즉, 배열을 인라인 참조 해제합니다. 같이 - ysth는 의견 제안으로

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

UPDATE

, 당신은 selectcol_arrayref()에 의해 반환되는 값 역 참조 (나중에 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

@yst : 감사합니다. 귀하의 제안을 포함하도록 답변을 업데이트했습니다. –