Удалить один символ в конце файла в PERL

#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);