关于CGI -> param的返回值问题

关于CGI -> param的返回值问题

今天遇到一个很郁闷的问题,本人很菜,在此请教各位:
(省略一些显而易见的废代码)


#新建一CGI对象

my $oCGI = new CGI;
#读取表单中的上传文件路径

my $filePath = $oCGI -> param("uploadFile");


然后,再read($filePath , my $buffer , 1024)可正确读取文件


但如果这样:

sub readCgi($) {
    my ($filePathRef) = @_;
    #在这里建立对象

    my $oCGI = new CGI;
    #读上传文件路径后保存

    $$filePathRef = $oCGI -> param("uploadFile");
}

my $filePath;
readCgi(\$filePath);



得到的$filePath却不能作为read的第一参数。

请问这是怎么一回事?param返回的到底是怎样的一个东西,又在什么情况下可以作为一个Handle使用?

你的参数要求是个引用, 但你传递的并不是 引用 啊
打错了嘛……显然这不是问题……

顶一顶,求助中。。。。。。
搞不明白你干吗整这么复杂,觉得可能跟 $oCGI 有关吧?你是不是应该传个 CGI 进去,而不是 new 一个?

sub readCgi {
    my $oCGI = shift;
    my $readFileRef = shift;
   
    ... ...
   
}

晕这哪是复杂不复杂的问题,我想知道的是为什么。我已经解决了,但现在是想知道问题所在,param返回的是啥。
你的办法是可行的。


QUOTE:
原帖由 JasonLee8872 于 2007-9-15 17:03 发表
晕这哪是复杂不复杂的问题,我想知道的是为什么。我已经解决了,但现在是想知道问题所在,param返回的是啥。
你的办法是可行的。

和 scope 有关吧。

你那个 $oCGI 是新 new 出来的,光杆司令,什么东西也没有。所以你那个 param 应该什么也不会返回给你。

你自己打印出来看看嘛。
错,显然是有返回值的。那个param返回的是一个纯粹的String。我就是很纳闷,$oCGI还在的话那返回的到底是个什么东西,又可以当String又可以当Handle的……


QUOTE:
原帖由 JasonLee8872 于 2007-9-15 18:13 发表
错,显然是有返回值的。那个param返回的是一个纯粹的String。我就是很纳闷,$oCGI还在的话那返回的到底是个什么东西,又可以当String又可以当Handle的……

这是书上讲的,你要是想知道 CGI 返给你什么东西,可以去看看代码啊

QUOTE:
CGI.pm creates a temporary file to store the contents of the upload; you can get a file handle for this file by passing the name of the file according to the file element to the upload method as follows:

my $file = $q->param( "file" );
my $fh   = $q->upload( $file );
The upload method was added to CGI.pm in Version 2.47. Prior to this you could use the value returned by param (in this case $file) as a file handle in order to read from the file; if you use it as a string it returns the name of the file. This actually still works, but there are conflicts with strict mode and other problems, so upload is the preferred way to get a file handle now. Be sure that you pass upload the name of the file according to param, and not a different name (e.g., the name the user supplied, the name with nonalphanumeric characters replaced with underscores, etc.).

这个……看代码永远是一件痛苦的事……谢谢了