分隔符编码的问题

发布于 2024-11-07 08:51:01 字数 790 浏览 0 评论 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> $!";"

If I run this script as it is, it works.
But why does this not work with cgi?
When I use _\01_ instead of _\00_ it works with cgi too.

#!/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> $!";"

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

变身佩奇 2024-11-14 08:51:01

_cool_name_ 说,对我有用。您可能与 CGI.pm 已经使用 \0 发生冲突,但由于您没有发布完整的代码,所以没有人可以肯定。

我将利用这个机会来回答这个问题。您应该吸取的教训是:

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

Works for me, says _cool_name_. You're probably running afoul of CGI.pm using \0 already for itself, but since you did not post your complete code, no one can say for sure.

I'll use the opportunity to unask the question. The lessons you should learn are:

  1. Avoid rolling your own serialisation scheme. As a beginner, 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). The array could have been passed intact unjoined via e.g. JSON.
  2. Instead of two scripts, these should be two subroutines in the same program. This way, you are able to pass data structures without the need to serialise.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文