没有包或对象引用,无法调用方法“import”

问题描述 投票:0回答:1

我的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

    ...
}
perl cgi
1个回答
3
投票

这里发生的是import不是内置的Perl功能。相反,它是一个methoduse通常在加载后调用一个包 - 你似乎试图在文件名上调用它,这是行不通的。

我想你是试图根据这些变量的内容动态加载包。这是几种方法之一:

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);

间接对象​​语法主要用于printing到文件句柄,如print $filehandle $output,但除此之外,不建议使用它,原因之一是你在这里观察到令人困惑的语法问题。

您可以使用B::Deparse来查看Perl如何解释您的源代码:

$ perl -MO=Deparse,-p -e 'import $projectID . "/" . $gTable;'
(($projectID->import . '/') . $gTable);

您收到该错误消息的原因是,在v5.18之前的Perl版本中(引用:bugcommitdelta),->左侧的字符串必须是已知名称,或者以字母数字字符开头。 (即使从v5.18开始,你理论上可以说"0689/vg76"->import,这几乎肯定不是你想要的,正如我上面所解释的那样。)

© www.soinside.com 2019 - 2024. All rights reserved.