2013-03-13 1 views
0

PostgreSQL поддерживает геометрические типы, и у меня есть база данных, полная их. Я бы хотел использовать Perl с DBIx: Class для их получения.Postgresql Geometry Type parseing В Perl?

Например, тип точки определяется как '(x, y)', и это возвращает DBIx :: Class. Как строка.

Я хотел бы разобрать это в массив или какой-либо другой более ощутимый тип данных.

Мои нынешние попытки разбора вовлекли зачистки скобки, а затем расщепление, которое отлично работает для точки, но не для полигона:

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

Моя следующая мысль была заменяющего («s для [» s, а затем JSON синтаксического анализа их который также работает, но я не люблю его.

кто-нибудь есть какие-либо предложения для более чистого метода синтаксического анализа?

Благодаря

ответ

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

Огромное спасибо, пошел с eval, поскольку входной сигнал никогда не принадлежит никому, кроме базы данных. –