Methods 无法通过包定位对象方法,即使我没有使用方法
我的代码大致如下:Methods 无法通过包定位对象方法,即使我没有使用方法,methods,runtime-error,perl,Methods,Runtime Error,Perl,我的代码大致如下: sub define_pattern { push @Internal::patterns, $_[0]; } package Internal { our @patterns = (); sub func { define_pattern { pattern => '(.*)\.c$' }; } } Internal::func; 当然,这是一个简化版本!现在,当我运行它时,它会输出: Can't locate object method "d
sub define_pattern { push @Internal::patterns, $_[0]; }
package Internal {
our @patterns = ();
sub func { define_pattern { pattern => '(.*)\.c$' }; }
}
Internal::func;
当然,这是一个简化版本!现在,当我运行它时,它会输出:
Can't locate object method "define_pattern" via package "pattern" (perhaps you forgot to load "pattern"?) at x.pl line 6.
我已经在谷歌上搜索了这个错误,并查看了几个类似的SO问题,但似乎没有一个能解决这个问题。为什么Perl认为define_模式是一种方法而模式是一个包?我认为这个错误只有在使用->like pattern->define_方法时才会发生。因为需要调用sub-define_模式,所以这只会是一个语法错误,除了间接对象语法之外,间接对象语法会起作用,并尝试将其作为一个方法在{}内部计算的对象上运行如此SuiteisBlacknot的回答中所述的阻塞
但是,我也会正确地更改名称空间,您需要限定调用以定义_模式。由于存在一个限制,即包位于同一编译单元中,因此我们将其保留在该位置
use warnings;
use strict;
package Internal;
our @patterns;
sub func {
main::define_pattern ( pattern => qr/(.*)\.c$/ );
}
package main;
Internal::func;
my @array = @Internal::patterns;
print "Copied onto \@array: |@array|\n";
sub define_pattern {
my %in = @_;
push @Internal::patterns, $in{'pattern'};
}
#sub define_pattern { push @Internal::patterns, $_[0]; }
注意。需要内部::func调用来触发define_pattern的操作,因此在本代码中,全局@Internal::patterns的任何使用都必须在该调用之后进行。所以他们被调换了。Regex是使用qr构建的。sub的更改最小,以便在全局数组中实际存储模式。代码打印指定的模式:
Copied onto @array: |(?-xism:(.*)\.c$)|
由于需要调用sub define_模式,因此这只会是一个语法错误,除非是间接对象语法,该语法会在{}块内假定计算的对象上作为方法运行,如ThisSuiteisBlacknot的回答所述
但是,我也会正确地更改名称空间,您需要限定调用以定义_模式。由于存在一个限制,即包位于同一编译单元中,因此我们将其保留在该位置
use warnings;
use strict;
package Internal;
our @patterns;
sub func {
main::define_pattern ( pattern => qr/(.*)\.c$/ );
}
package main;
Internal::func;
my @array = @Internal::patterns;
print "Copied onto \@array: |@array|\n";
sub define_pattern {
my %in = @_;
push @Internal::patterns, $in{'pattern'};
}
#sub define_pattern { push @Internal::patterns, $_[0]; }
注意。需要内部::func调用来触发define_pattern的操作,因此在本代码中,全局@Internal::patterns的任何使用都必须在该调用之后进行。所以他们被调换了。Regex是使用qr构建的。sub的更改最小,以便在全局数组中实际存储模式。代码打印指定的模式:
Copied onto @array: |(?-xism:(.*)\.c$)|
你被人咬了。Perl解释如下:
define_pattern { pattern => '(.*)\.c$' };
作为方法的名称,后跟返回发票的块。您可以通过间接杂注看到这一点:
输出:
Indirect call of method "define_pattern" on a block at foo line 10.
为什么解析器认为define_模式是一种方法而不是一个常规的子例程?因为内部包中没有名为define_pattern的子例程;主要是你定义的
如果从另一个包调用未导出的子例程,则必须使用完全限定的子例程名称:
main::define_pattern({ pattern => '(.*)\.c$' });
如果在调用之前声明了define_模式,则括号是可选的。您正被它咬着。Perl解释如下:
define_pattern { pattern => '(.*)\.c$' };
作为方法的名称,后跟返回发票的块。您可以通过间接杂注看到这一点:
输出:
Indirect call of method "define_pattern" on a block at foo line 10.
为什么解析器认为define_模式是一种方法而不是一个常规的子例程?因为内部包中没有名为define_pattern的子例程;主要是你定义的
如果从另一个包调用未导出的子例程,则必须使用完全限定的子例程名称:
main::define_pattern({ pattern => '(.*)\.c$' });
如果在调用之前声明了define_模式,则括号是可选的。No;它在同一个文件中。有一长串非常混乱的原因,但只要假设这是必要的……而且,代码可以编译,但不会运行。错误在内部::func.No;它在同一个文件中。有一长串非常混乱的原因,但只要假设这是必要的……而且,代码可以编译,但不会运行。错误在Internal::func中。您的define\u模式是什么?你用卷发调用它,但没有限定它。顺便说一句@zdim它通常有点长,但它基本上做它所显示的,除了完整版本对输入参数进行一些检查和修改。你的define_模式是什么?你是用卷发调用它,而不是限定它。顺便说一句@zdim它通常有点长,但它基本上做它所显示的,除了完整版本对输入参数进行一些检查和修改之外。