没有包或对象引用,无法调用方法“import”
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了没有包或对象引用,无法调用方法“import”相关的知识,希望对你有一定的参考价值。
我的Perl CGI程序使用import
函数,我称之为.pm
文件。
在下面的代码中,当$projectID
是一个字符串时 - 例如"try"
-没有导入错误。但如果是数字 - 例如。 "0689"
-然后出现以下错误
如果没有aa.cgi第993行的包或对象引用,则无法调用方法“import”。
my $projectID = "0689"
my $gTable = "vg" . $tm . ".pm";
my $new_vPath = $hconfig::usersPNG . $vnm;
my $gen_listPath = $usersTMP . $gTable;
if ( -e $new_venPath && -e $gen_listPath ) {
require $projectID . '/' . $gTable;
import $projectID . '/' . $gTable; # try2/vg77.pm -> no error # 0689/vg76.pm -> import error
...
}
这里发生的是import
不是内置的Perl功能。相反,它是一个method,use
通常在加载后调用一个包 - 你似乎试图在文件名上调用它,这是行不通的。
我想你是试图根据这些变量的内容动态加载包。这是几种方法之一:
my $filename = '/path/to/Package/Name.pm';
my $packagename = 'Package::Name';
require $filename;
$packagename->import();
关于动态加载模块的一点要注意的是,与use
加载的模块不同,Perl不会知道在编译时从这些包导出的函数。结果是你不能在调用那些函数时省略括号。
例如:如果你有一个模块Foo
导出函数foo
,你可以说:use Foo; foo "bar";
。但是如果你用上面的代码加载Foo
,你必须说foo("bar");
。
顺便说一句,我怀疑0689::vg76
是你的一个包的名称。如果你能解释一下你正在尝试加载的内容,例如0689/vg76.pm
文件的样子以及你从中加载的内容(比如,他们真的有sub import
吗?),也许我们可以建议一个更合适的方法加载他们。
import $projectID . '/' . $gTable;
仍然是有效语法的原因是Perl将其解释为Indirect Object Syntax,其中method_name $object @parameters;
被视为$object->method_name(@parameters);
。
间接对象语法主要用于print
ing到文件句柄,如print $filehandle $output
,但除此之外,不建议使用它,原因之一是你在这里观察到令人困惑的语法问题。
您可以使用B::Deparse
来查看Perl如何解释您的源代码:
$ perl -MO=Deparse,-p -e 'import $projectID . "/" . $gTable;'
(($projectID->import . '/') . $gTable);
您收到该错误消息的原因是,在v5.18之前的Perl版本中(引用:bug,commit,delta),->
左侧的字符串必须是已知名称,或者以字母数字字符开头。 (即使从v5.18开始,你理论上可以说"0689/vg76"->import
,这几乎肯定不是你想要的,正如我上面所解释的那样。)
以上是关于没有包或对象引用,无法调用方法“import”的主要内容,如果未能解决你的问题,请参考以下文章