Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Methods 无法通过包定位对象方法,即使我没有使用方法_Methods_Runtime Error_Perl - Fatal编程技术网

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它通常有点长,但它基本上做它所显示的,除了完整版本对输入参数进行一些检查和修改之外。