2011-05-14 54 views
0

如果我按原样运行此脚本,它将起作用。
但是,为什么这不适用于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> $!";" 

回答

5

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

我会利用这个机会来解决这个问题。您应该学习的教训是:

  1. 避免滚动您自己的序列化方案。作为一个初学者,如果它发生在数据中(c.f.字符串表达式中的双反斜杠和sprintf表达式中的双重反斜杠),您已经犯下了不对编码器进行编码的典型错误。该阵列可能已经完整地通过例如未连接的方式传递。 JSON
  2. 而不是两个脚本,这些应该是在同一个程序中的两个子例程。这样,您就可以传递数据结构而无需序列化。
+0

它与JSON合作。但是我还没有理解''如果它发生在数据中('c.f.字符串表达式中的双反斜杠和sprintf表达式中的双百分比)''''',你就犯了不编码分隔符的典型错误。 – 2011-05-14 13:59:51

+0

考虑用反斜杠表示的字符串中的特殊字符。当你需要表达反斜杠本身时,你做了什么?对于更复杂的例子,研究PCX中的RLE。然后将你的知识应用于这种情况,如果任何元素已经包含'\ 0',你的@array会发生什么。 – daxim 2011-05-15 07:50:13