Проблемы с разделителем-кодировкой - PullRequest
0 голосов
/ 14 мая 2011

Если я запускаю этот скрипт как есть, он работает.
Но почему это не работает с cgi?
Когда я использую _\01_ вместо _\00_, он работает и с 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 "_\00_", @array;
say $row;
# submit $row to script_2.cgi


###    script_2.cgi    #########################################
# ...
# my $row = $cgi->param('row');
# my $name;

if ( $row =~ /_\00_([^\00]+)_\00_type\z/ ) {
#   $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 Ответ

5 голосов
/ 14 мая 2011

У меня работает, говорит _cool_name_.Вы, вероятно, столкнулись с CGI.pm, используя \0 уже для себя , но так как вы не опубликовали свой полный код, никто не может сказать наверняка.

Я будуиспользуйте возможность, чтобы снять вопрос.Уроки, которые вы должны выучить:

  1. Избегайте использования собственной схемы сериализации.Как новичок, вы допустили типичную ошибку, не кодируя разделитель, если он встречается в данных (см. Двойной обратный слеш в строковых выражениях и двойной процент в выражениях sprintf).Массив можно было бы передать без изменений, например, JSON .
  2. Вместо двух сценариев, это должны быть две подпрограммы в одной программе.Таким образом, вы можете передавать структуры данных без необходимости сериализации.
...