0

PostgreSQL 支持几何类型,我有一个充满它们的数据库。我想使用 Perl 和 DBIx:Class 来检索它们。

例如,点类型被定义为'(x,y)',这就是 DBIx::Class 检索它的方式。作为一个字符串。

我想将其解析为数组或其他更具体的数据类型。

我当前的解析尝试涉及剥离括号然后拆分,这对点有效,但对多边形无效:

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

我的下一个想法是替换 ('s for ['s 然后 JSON 解析它们,这也有效,但我不喜欢它。

有没有人对更清洁的解析方法有任何建议?

谢谢

有关 PostgreSQL 几何的更多详细信息

4

1 回答 1

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);
于 2013-03-13T23:41:45.610 回答