关于对cgi参数的处理问题

关于对cgi参数的处理问题

大家好,我的cgi文件内容如下,文件名为test.cgi
use CGI;
my $web = new CGI;
my $para = $web->Vars;
my $MAXROWS = $$para{'startrec'};
print "$MAXROWS\n";
if ($MAXROWS =~ /^\s*0*([1-9]\d*)\s*$/) {
        $MAXROWS = $1;
}
else {
     $MAXROWS = 15;
}
print "$MAXROWS\n";

1.我用如下命令执行
perl test.cgi startrec=9
输出结果为
9
9

2.但是我用如下命令执行
perl test.cgi startrec=9 startrec=
输出结果为
9
15

3. 用如下命令执行
perl test.cgi startrec=9 startrec=5
输出结果为
95
15

大家帮我看看出现这样的现象的原理是什么,我能感觉出哪不对劲,但是说不准。还请不吝赐教。谢谢。
传经来的参数是存放在一个hash里面的
你对同一个键赋值两次,其实它内部的实现是把两个value给拼接起来的,类似于下面的代码

[Copy to clipboard] [ - ]
CODE:
$hash{key} .=value;

所以你第三个传入的实际上是9和5拼接之后形成的新的值95
谢谢,那第一种情况和第二种情况的比较呢?
第二种情况中的9就没有匹配那个模式。是不是两个值拼接的时候使用了\s不能覆盖的看不见的分隔符呢?

对于第三种情况的输入, 我如果把匹配的模式由/^\s*0*([1-9]\d*)\s*$/变成/\s*0*([1-9]\d*)\s*/,即去掉最前面的^和最后面的$,那么只有9匹配了,5没有匹配。这就更加证明了在9和5中间有一个我们看不到的分隔符,而且这个分隔符不包含在\s能够代表的空白字符集内。

但是我却查不到这个看不见的字符是什么。哪位如果查到了请告诉一声,谢谢!

perldoc CGI
里面搜索Vars
分隔符是'\0' (NULL)


[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl
use strict;
use warnings;
use CGI;
my $q = new CGI;
my $params = $q->Vars;
my @foo = split("\0",$params->{"test"});
print "$_\n" foreach @foo

运行结果

QUOTE:
kernel@fariland:./cgi test=5 test=6
5
6

十分感谢!看来我应该加强对perldoc工具的重视和使用。