#regex #perl #encoding #cgi #ascii
#регулярное выражение #perl #кодирование #cgi #ascii
Вопрос:
Если я запускаю этот скрипт как есть, он работает.
Но почему это не работает с cgi
?
Когда я использую _1_
вместо _0_
cgi
, это тоже работает с,,.
#!/usr/bin/env perl
use warnings;
use 5.012;
### script_1.cgi #########################################
my @array = ( '1524', '2.18 MB', '09/23/03', '_cool_name_', 'type' );
my $row = join "_0_", @array;
say $row;
# submit $row to script_2.cgi
### script_2.cgi #########################################
# ...
# my $row = $cgi->param('row');
# my $name;
if ( $row =~ /_0_([^0] )_0_typez/ ) {
# $name = $1;
say "Name: <$1>";
} else {
die "<$row> $!";
}
# Software error:
# <1524_�_2.18 MB_�_09/23/03_�__cool_name__�_type> at script_2.cgi line of "die "<$row> $!";"
Ответ №1:
У меня работает, говорит _cool_name_
. Вероятно, вы столкнулись сCGI.pm использование
уже для себя, но поскольку вы не опубликовали свой полный код, никто не может сказать наверняка.
Я воспользуюсь возможностью, чтобы снять вопрос. Уроки, которые вы должны усвоить, это:
- Избегайте развертывания вашей собственной схемы сериализации. Как новичок, вы допустили типичную ошибку, не закодировав разделитель, если он встречается в данных (например, двойная обратная косая черта в строковых выражениях и двойной процент в выражениях sprintf). Массив мог быть передан неповрежденным, несвязанным, например, через JSON.
- Вместо двух сценариев это должны быть две подпрограммы в одной программе. Таким образом, вы можете передавать структуры данных без необходимости сериализации.
Комментарии:
1. Это сработало с JSON. Но я еще не понял
you have made the typical mistake of not encoding the separator if it occurs in the data (c.f. double backslash in string expressions and double percent in sprintf expressions)
-часть.2. Подумайте о специальных символах в строках, которые обозначаются обратной косой чертой. Что вы делаете, когда вам нужно выразить саму обратную косую черту? Для более сложного примера изучите RLE в PCX. Затем примените свои знания к ситуации, что произойдет с вашим @array, если какой-либо элемент уже содержит
.