#html #perl #jsonp
#HTML #perl #jsonp
Вопрос:
Итак, я столкнулся с проблемой при программировании на PERL. Я использую цикл foreach, чтобы получить некоторые данные из хэша, поэтому он должен проходить через него.
Код:
foreach $title (keys %FilterSPRINTHASH) {
$openSP = $FilterSPRINTHASH{$title}{openSP};
$estSP = $FilterSPRINTHASH{$title}{estSP};
$line = "'$title':{'openSP' : $openSP, 'estSP' : $estSP}n";
print $outfile "$linen";
}
Дело в том, что я создаю отдельный файл с записью PERL в файловое выражение, которое будет текстом JSONP (позже используется для HTML).
Вернемся к проблеме:
Поскольку JSONP требует запятой «,» после каждой строки, которая не является последней, мне пришлось поставить запятую в конце строки, однако, когда появляется последняя строка, я должен удалить запятую.
Я пробовал использовать функцию CHOP, но не уверен, куда ее поместить, поскольку, если я помещу ее в конец foreach , она просто удалит запятую в $line , но это не приведет к ее удалению в новом файле, который я создал.
Я также пытался использовать оператор while (<>), но безуспешно.
Любые идеи приветствуются.
BR
Ответ №1:
Использование JSON
модуля гораздо менее подвержено ошибкам; нет необходимости изобретать велосипед
use JSON;
print $outfile encode_json(%FilterSPRINTHASH), "n";
Комментарии:
1. Это было бы действительно хорошо, но я не заметил использования для JSONP. Последняя буква важна, потому что JSONP позволяет вам взаимодействовать с вашим HTML без веб-сервера. В то время как JSON этого не допускает. Хотя спасибо
2. @user3533253 JSONP также использует JSON, так что было бы
"$callback(". encode_json(%FilterSPRINTHASH) .")"
3. Привет, mpapec! Итак, чтобы полностью понять это для себя — с добавлением обратного вызова («encode_json(….).») PERL знает, что я хочу получить формат JSONP автоматически?
4. @user3533253 Нет, это просто вручную добавляет оформление JSONP вокруг JSON.
5. @user3533253 Боюсь, вам не хватает необходимого понимания, чтобы различать JSON и JSONP, и это уже выходит за рамки вашего первоначального вопроса.
Ответ №2:
Вы можете проверить, является ли это последней итерацией цикла, а затем удалить запятую из строки.
Итак, что-то вроде
my $count = keys %FilterSPRINTHASH; #Get number of keys (scalar context)
my $loop_count = 1; #Use a variable to count number of iteration
foreach $title (keys %FilterSPRINTHASH){
$openSP = $FilterSPRINTHASH{$title}{openSP};
$estSP = $FilterSPRINTHASH{$title}{estSP};
$line = "'$title':{'openSP' : $openSP, 'estSP' : $estSP}n";
if($loop_count == $count){
#this is the last iteration, so remove the comma from line
$line =~ s/, $//;
}
print $outfile "$linen";
$loop_count ;
}
Комментарии:
1. Хорошая идея, я попробую! Спасибо!
Ответ №3:
я бы подошел к этому, сохранив ваш вывод в массиве, а затем присоединив его к разделителям строк, которые вы хотите:
my @output; # storage for output
foreach $title (keys %FilterSPRINTHASH) {
# create each line
my $line = sprintf "'%s':{'openSP' : %s, 'estSP' : %s}", $title, $FilterSPRINTHASH{$title}{openSP}, $FilterSPRINTHASH{$title}{estSP};
# and put it in the output container
push @output, $line;
}
# join all outputlines with comma and newline and then output
print $outfile (join ",n", @output);