分隔符编码的问题

时间:2011-05-14 09:42:47

标签: regex perl encoding cgi ascii

如果按原样运行此脚本,则可以正常运行 但为什么这不适用于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 个答案:

答案 0 :(得分:5)

对我而言,_cool_name_说。您可能与CGI.pm using \0 already for itself发生冲突,但由于您没有发布完整的代码,因此没有人可以肯定地说。

我将利用这个机会解开问题。你应该学到的课程是:

  1. 避免滚动自己的序列化方案。作为一个初学者,如果它出现在数据中(c.f。字符串表达式中的双反斜杠和sprintf表达式中的双百分比),那么你就犯了一个典型的错误:不对分隔符进行编码。该阵列可以通过例如未加入的方式完整地传递。 JSON
  2. 这些应该是同一程序中的两个子程序,而不是两个脚本。这样,您就可以传递数据结构而无需序列化。