2013-03-13 3 views
0

PostgreSQL은 기하학적 형식을 지원하며 데이터베이스가 가득합니다. Perl에 DBIx : Class를 사용하여 검색하고 싶습니다.Postgresql 지오메트리 형식 parseing in Perl?

예를 들어 포인트 유형은 '(x, y)'로 정의되며 DBIx :: Class가이를 검색하는 방식입니다. 문자열로.

이 배열 또는 일부 다른 유형의 데이터 형식으로 구문 분석하고 싶습니다.

((x1 , y1) , ... , (xn , yn)) 
(x1 , y1) , ... , (xn , yn) 
(x1 , y1 , ... , xn , yn) 
    x1 , y1 , ... , xn , yn 

나의 다음 생각의 '정보 [s'을 (교체 한 후 JSON이 그들을 구문 분석 :

나의 현재 구문 분석 시도는 다각형에 대한 점 잘 작동하지만 괄호 다음 분할을 제거 관여 한

사람은 청소기 분석 방법에 대한 어떤 제안이 있는가하는도 작동하지만 나는 그것을 좋아하지 않아.?

감사

More details on PostgreSQL Geometry

답변

0
### First Option - just replace (with ] and eval it as arrays of array 
sub parsePolyEval { 
     my $polyString = shift; 
    $polyString =~ s/\(/\[/g; 
    $polyString =~ s/\)/\]/g; 

    return eval($polyString); 
} 

### Second option - parse inner arrays. Assuming That a polygon consists of lists of  points (level 2 array), and not defined recursivley 
sub parsePolySPlit { 
    my $polyString = shift; 
    my @polyArray; 
    my @subArrays = ($polyString =~ /\(([^\)\()]+)\)/g); 

    foreach (@subArrays) { 
     my @subArray = split(/[\s\,]+/,$_); 
     @subArray = grep {$_ ne ""} @subArray; ##ignore empty elements caused by spaces 
     push(@polyArray,\@subArray); 
    } 

    return \@polyArray; 
} 

sub printPoly { 
    my $poly = shift; 
    my $i=0; 
    foreach (@$poly) { 
     print "Point number $i is: ".join("|",@$_)."\n"; 
     $i++; 
     } 
} 

my $polyString = "((x1 , y1) ,(x2 , y3) , (xn , yn))"; 

my $poly1 = parsePolyEval($polyString); 
printPoly($poly1); 
my $poly2 = parsePolySPlit($polyString); 
printPoly($poly2); 
+0

감사의 말로는 입력이 데이터베이스가 아닌 다른 사람으로부터 온 것이 아니기 때문에 감사합니다. –