Perl - 无法在未定义的值上调用方法“content_type”

时间:2011-12-06 18:16:12

标签: perl

所以,我有一个我试图运行的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新手。

2 个答案:

答案 0 :(得分:4)

如果$r来自@ARGV,则它不会有content_type方法。

您可能会bless $r进入某个套餐,但这肯定不是您打算做的事情。

我猜你想要获得一个CGI参数,可能是一个POST ed上传文件?所以你希望$r成为CGI对象,而不是参数。你从

开始
 my $r = CGI->new;

但是,我推荐给你来自shell的CGIhttp://perldoc.perl.org/CGI.htmlperldoc 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)

Perldoc说:

  

如果省略了ARRAY,则将@_数组移到词法范围内   子程序和格式,以及子程序(...)

外的@ARGV数组

这是第二种情况(@ARGV)似乎是空的。尝试转储@ARGV以检查其内容。