2013-03-13 65 views
0

PostgreSQL支持幾何類型,我有一個數據庫充滿了它們。我想用Perl和DBIx:Class來檢索它們。Postgresql幾何類型解析在Perl中?

例如,點類型被定義爲'(x,y)',這就是DBIx :: Class如何檢索它。作爲一個字符串。

我想解析這個數組或其他更有形的數據類型。

我現在的解析嘗試已經涉及剝離支架,然後拆分這對於點工作正常,但不是多邊形:

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

我的下一個想法是取代(的爲['秒,然後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

非常感謝,因爲輸入永遠不會來自數據庫以外的任何人。 – 2013-03-19 18:04:39