【问题标题】:How can I open a javascript object in Perl?如何在 Perl 中打开 javascript 对象?
【发布时间】:2012-08-03 11:48:21
【问题描述】:

我有一个带有 5.5mb 经度纬度数据的 JavaScript 对象文件,我想在 Perl 中打开它,这样我就可以应用一个粗略的细节缩减算法,然后用缩减的数据集保存一个新的对象文件。为了减少细节,我使用了一个 for 循环,它只需要每 20 个 long/lat 对。

我可以在 javascript 中执行此操作,但这需要我复制/粘贴每个坐标集并一次在其上运行我的 JavasSript。

然后我想也许我可以获取每组坐标并将它们放入 SQL 数据库,但这似乎是一种粗略的方法。并移动大量数据。

我认为 Perl 是更好的选择之一,在服务器上完成所有工作。

我可以打开文件:

#!/usr/bin/perl

# open file
 open(FILE, "reduced_object_latlng.js") or die("Unable to open file");

# read file into an array
@data = <FILE>;

# close file 
close(FILE);

# print file contents
foreach $line (@data)
{
    print $line;
}

对象遵循此设计:

var paths = {
    mayo: {
        name: 'Mayo',
        colour: 'green',
        coordinates: '-9.854892,53.76898 -9.853634,53.769338 -9.85282,53.769387 -9.851981,53.769561 -9.850952,53.769508 -9.850129,53.769371 -9.849136,53.769171 **data**' 
    },
    galway: {
        name: 'Galway',
        colour: 'purple',
        coordinates: '**data**;
    }
}; //etc.

为了说明我如何减少上述数据,我的 javascript 版本从带有一个 var coords = "*data*" 的文件加载

coords = coords.split(" ");
var path = [];
    var output="";
    document.getElementById("map_canvas").innerHTML = "";
for (var i = 0; i < coords.length; i++) {
        if (i%20==0)
        {
            var coord = coords[i].split(",");
            output += coord[0]+","+coord[1]+" ";
        }
}
document.getElementById("map_canvas").innerHTML = output;

我读过一些建议我将其转换为 JSON,但我不确定是否需要这样做。而不是编写纯文本处理程序,有没有办法将文件作为对象加载?


我被时间困住了,所以我这样做了:

var outputobject = 'var paths = {';
    for (property in copypaths) {
        outputobject += property + ': { ';
        outputobject += "name: '" + copypaths[property].name+"',";
        outputobject += "colour: '"+ copypaths[property].colour+"',";

        var reducedoutput="";
        var coord = copypaths[property].coordinates.split(" ");
        for (var i = 0; i < coord.length; i++) {
            if (i%20==0)
            {
                var coords = coord[i].split(",");
                reducedoutput += coords[0]+","+coords[1]+" ";
            }
        }   
        outputobject += "coordinates: '"+ reducedoutput+"'},";
    }
    outputobject += "};";
    document.getElementById("reduced").innerHTML = outputobject;

它仍然涉及复制/粘贴和删除最后一个,。 谢谢@Oleg V. Volkov,当我在本周晚些时候有更多时间时,我会看看你提出的方法。

【问题讨论】:

    标签: javascript json perl object


    【解决方案1】:

    只需剥离前导 JavaScript,这样您就可以使用裸键获得几乎正确的 JSON,并使用 JSON/JSON::PP 实例并将 allow_barekey 设置为 true 值来解码结果字符串。

    【讨论】:

    • 只是为了确保我理解正确。当您说剥离领先的 javascript 时:您是说我应该在 JSON 中创建一个仅包含坐标数据的新文件吗?我最终会得到一大堆数字,不是吗,那需要我手动复制粘贴。
    • @Chris,我的意思是剥离 var paths = 部分 - 直到打开 { 之前的所有内容。您不需要编写另一个文件,只需使用正则表达式或类似处理您已读入内存的内容。
    【解决方案2】:

    使用JSON 是您最好的选择。它具有允许您解码不太严格的 JSON 语法的选项,您将需要

    • allow_singlequote 允许单引号和双引号字符串

    • allow_barekey 允许全字母数字哈希键完全没有引号

    • decode_prefix 忽略数据结束后的垃圾

    • relaxed祝你好运

    下面的程序将 JSON 解码为 Perl 结构,提取 mayo 条目的坐标字符串,并将值成对打印出来。

    请注意,我删除了分号并在 coordinates: '**data**; 末尾添加了一个引号,因为我认为这是一个错误,而不是实际的 JavaScript 数据

    use strict;
    use warnings;
    
    use JSON -support_by_pp;
    
    my $json = JSON->new->relaxed->allow_singlequote->allow_barekey;
    
    my $data = do {
      local $/;
      <DATA>;
    };
    
    my ($hash) = $json->decode_prefix($data =~ /(\{.*)/s);
    
    my @coords = $hash->{mayo}{coordinates} =~ /[-0-9.]+/g;
    
    printf "%f %f\n", splice @coords, 0, 2 while @coords;
    
    __DATA__
    var paths = {
        mayo: {
            name: 'Mayo',
            colour: 'green',
            coordinates: '-9.854892,53.76898 -9.853634,53.769338 -9.85282,53.769387 -9.851981,53.769561 -9.850952,53.769508 -9.850129,53.769371 -9.849136,53.769171 **data**' 
        },
        galway: {
            name: 'Galway',
            colour: 'purple',
            coordinates: '**data**'
        }
    }; //etc.
    

    输出

    -9.854892 53.768980
    -9.853634 53.769338
    -9.852820 53.769387
    -9.851981 53.769561
    -9.850952 53.769508
    -9.850129 53.769371
    -9.849136 53.769171
    

    【讨论】:

    • 谢谢@Borodin,当您添加答案时,我正在编辑我的问题。 **data**; 一个错字:P
    • 阅读您对问题的更改看起来您正在自己构建类似 JSON 的哈希作为字符串。那么数据是从哪里来的呢? Perl 将在服务器机器上运行,而 JavaScript 代码在客户端,因此 Perl 无法真正处理 JavaScript 的输出。您如何看待这项工作?
    • 我的数据集来自谷歌融合表,包含区域的 KML。我将此数据转换为 JavaScript 对象。全部运行后,我发现数据集 5.5MB 大得令人望而却步,因此我尝试减小大小。只有在地图上缩放时,删除的长/纬度对才会成为问题。我做了所有这些,所以我可以使用地图数据来创建可以处理事件的多边形。我不知道有什么方法可以在地图上通过点击以外的事件获得交互式 KML。我以前从未使用过 Perl,并认为这是一个不错的开始。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 2014-03-24
    • 1970-01-01
    相关资源
    最近更新 更多