Как распечатать данные JSON с помощью Perl без использования модуля JSON? - PullRequest
8 голосов
/ 17 октября 2011

Я пытаюсь написать автозаполнение для моего словарного проекта, размещенного на SourceForge. К сожалению, Perl на SF не имеет установленного модуля JSON. Как я могу обойти это, не используя сам модуль? В качестве модели я взял руководство по автозаполнению JQuery UI по jensbits .

Вот код Perl, который должен запрашивать текст и отправлять в модуль автозаполнения

#!/usr/bin/perl
use strict;
use CGI;
use DBI;
use JSON;
# HTTP HEADER 
print "Content-type: application/json; charset=iso-8859-1\n\n";

my $dbh = DBI->connect("DBI:mysql:database;mysql_read_default_file=/path/.my.cnf");

$dbh->do("set character set utf8");
$dbh->do("set names utf8");

my ($p, $sth, @query_output); 

$p = new CGI;
my $term = $p->param('term');

$sth = $dbh->prepare(qq{SELECT trim(both char(13) FROM article) AS value, definition FROM dict WHERE article like ?;});
$sth->execute('%'.$term.'%');

# LOOP THROUGH RESULTS
while ( my $row = $sth->fetchrow_hashref ){
push @query_output, $row;
}
#CLOSE THE DATABASE CONNECTION
$dbh->disconnect()
# JSON OUTPUT
print JSON::to_json(\@query_output);

Ответы [ 3 ]

7 голосов
/ 17 октября 2011

Почему бы не установить модуль в каталог пользователя на SourceForge, используя local :: lib ?

3 голосов
/ 17 октября 2011

Если вы действительно не можете установить модуль JSON, нетрудно написать простой кодер JSON самостоятельно:

sub to_json {
    my $val = shift;
    if (not defined $val) {
        return "null";
    } elsif (not ref $val) {
        $val =~ s/([\0-\x1f\"\\])/sprintf "\\u%04x", ord $1/eg;
        return '"' . $val . '"';
    } elsif (ref $val eq 'ARRAY') {
        return '[' . join(',', map to_json($_), @$val) . ']';
    } elsif (ref $val eq 'HASH') {
        return '{' . join(',', map to_json($_) . ":" . to_json($val->{$_}), sort keys %$val) . '}';
    } else {
        die "Cannot encode $val as JSON!\n";
    }
}
print to_json($data);

Этот код закодирует undef as null, arrayrefs как JSON-массивы, hashrefs как JSON-объекты и все определили нереферентные скаляры как строки JSON.Он умрет, если встретится с чем-то еще;в частности, он не сопоставляет \1 и \0 с true и false, как это делает модуль JSON, хотя при желании его легко добавить.


какальтернатива, Data::Dumper может быть настроена на испускание чего-то, приближающего JSON, путем установки соответствующих опций:

use Data::Dumper ();
print Data::Dumper->new([ $data ])->Pair(':')->Terse(1)->Useqq(1)->Deepcopy(1)->Dump();

Однако результирующий вывод может быть не на 100% действительным JSON;в частности, даже с этими параметрами обработка Data::Dumper undef и строк, содержащих специальные или непечатаемые символы, не полностью соответствует спецификации JSON.

3 голосов
/ 17 октября 2011

Насколько я знаю, пакет JSON не нужно устанавливать в системе.Вы можете просто скачать последний дистрибутив JSON , распаковать, загрузить его на свой хостинг и сообщить Perl, где взять код: просто добавьте

use lib '/absolute/path/to/JSON/lib';

до

use JSON;

Если вы не знаете абсолютный путь или хотите сделать код более переносимым, вы можете использовать пакет FindBin , чтобы найти JSON distro dir относительно вашего двоичного файла:

use FindBin
use lib "$FindBin::Bin/JSON/lib";

Я надеюсь, что это решит вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...