所以,我有一个我试图运行的PERL脚本,它是这样开始的:
use strict;
use a;
use CGI 'param';
use URI::Escape;
use HTML::FromText 'text2html';
use XML::Simple;
use LWP::UserAgent;
use Data::Dumper;
use URI::Escape;
use DBI;
use Tie::DBI;
use Digest::MD5 'md5_hex';
use MIME::Base64;
use Encode;
my $r = shift; $r->content_type("text/html; charset=utf-8"); my $tmp = a::tmp();
当它到达调用content_type()函数的部分时,它会失败并显示以下错误消息:
Can't call method "content_type" on an undefined value at script.pl line 18.
有什么想法吗?我是PERL新手。
答案 0 :(得分:4)
如果$r
来自@ARGV
,则它不会有content_type
方法。
您可能会bless
$r
进入某个套餐,但这肯定不是您打算做的事情。
我猜你想要获得一个CGI参数,可能是一个POST
ed上传文件?所以你希望$r
成为CGI
对象,而不是参数。你从
my $r = CGI->new;
但是,我推荐给你来自shell的CGI
,http://perldoc.perl.org/CGI.html或perldoc CGI
的非常好的手册。
(扩大一点:)
在Perl中,$ scalar var保存"任何一件事。"从命令行进入的东西通常是字符串(可能是数字,在美好的一天);那是shift
在顶级得到的东西。 (特殊变量@ARGV
包含传递给程序的命令行参数。)
"一件事"也可以是对象的引用。在Perl的面向对象模型中,包的方法 (" class")使用bless
与该引用相关联。但是,这通常是为你处理的;特殊子例程(又称函数,方法)CGI::new
将创建一个新的CGI
对象,其中包含一些状态数据(如表单字段'值),bless
将其添加到CGI
中1}}包。
只有当您的变量包含->
ed引用时,才能使用bless
符号进行函数调用。你可以"问"使用ref
在变量中有什么样的引用;你将得到它的包名(又名类)。 ($foo = []; bless $foo => 'Some::Package'; print ref $foo;
=> Some::Package
)
- 但是,对于您的具体情况,请查看CGI
模块手册中的一些示例: - )
答案 1 :(得分:0)