分隔符编码的问题

sid*_*com 0 regex perl encoding ascii cgi

如果我按原样运行这个脚本,它就可以了.
但为什么这不起作用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> $!";"
Run Code Online (Sandbox Code Playgroud)

dax*_*xim 5

对我有用,说_cool_name_.你可能已经使用\0CGI.pm,但是由于你没有发布完整的代码,没有人可以肯定地说.

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

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