Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.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
如何查找此行引用的Perl代码?_Perl - Fatal编程技术网

如何查找此行引用的Perl代码?

如何查找此行引用的Perl代码?,perl,Perl,我继承了一些Perl代码,其中包含一行对我来说很神秘的代码: my $binary = A->current->config->settings('arg1', 'arg2') 基本上,我不知道如何找到相关的代码。“A”在本地代码中不是一个变量,所以我认为这是一个类层次结构。但是,我检查了目录结构以查看是否存在以下路径,但没有: A/current/config/settings.pm A->current->config->settings是否保证是嵌套类层次结构,或者是

我继承了一些Perl代码,其中包含一行对我来说很神秘的代码:

my $binary = A->current->config->settings('arg1', 'arg2')
基本上,我不知道如何找到相关的代码。“A”在本地代码中不是一个变量,所以我认为这是一个类层次结构。但是,我检查了目录结构以查看是否存在以下路径,但没有:

A/current/config/settings.pm
A->current->config->settings
是否保证是嵌套类层次结构,或者是其他什么?例如,
config
实际上可能是另一个对象
a->current
的属性或方法吗


我们将非常感谢您提供的任何帮助

A
是一个类名,您应该在
A.pm
中找到它
current
应该是在
a.pm
中的
sub-current
下定义的类方法。它返回一个对象,该对象的
config
方法正在被调用,该对象再次返回一个对象,该对象的
settings
方法正在被参数
'arg1'
'arg2'
调用(实际上,对象本身就是第一个参数)


事实上,任何方法都可以返回类而不是对象。

逐步浏览中的代码,看看它将带您去哪里

foo->bar
是一个方法调用,这意味着在
foo
引用的包(或超类)中可能定义了一个名为
bar
的子例程,并且不提供有关是否存在包
bar
foo::bar
的信息

A->current->config->settings
是否保证为嵌套类层次结构

您考虑的是
A::current::config::settings

以下是方法调用:

INVOCANT->name
INVOCANT->name(LIST)
这意味着
A->current->config->settings
是一个方法调用链

该代码中唯一命名的类是
A

config
是否实际上是另一个对象的属性或方法
a->current

它是
a->current
返回的对象或类的方法的名称

如何查找此行引用的Perl代码

是的缩写

my $obj1   = A->current;
my $obj2   = $obj1->config;
my $binary = $obj2->settings('arg1', 'arg2');
现在已经有了可用的对象,您可以使用

say ref($obj) || "Not a reference";


如前所述,您正在处理名为
a
的类中的一系列方法调用,其中至少第一个方法调用是a,因为它是在类(
a
)本身上调用的,而不是在对象上调用的

找到该类的一个简单方法是使用

它打印了我在测试中使用的类的完整路径。另请参见加载的文件名


另一种询问类的有趣方法是在运行时添加到类中

创建
A
的对象,并在运行时向其添加您选择的方法

my $objA = A->new();

eval q( sub A::get_info { print "$_\n" for (caller(0)) } );    
if ($@) { print "Eval: $@" };

eval q( sub A::boom { croak "Stacktrace: " } );
if ($@) { print "Eval: $@" };

$objA->get_info();

$objA->boom();
这些都是简单的示例,但实际上您可以从方法内部获取任何信息

如果
A
碰巧没有名为
new
(可能)的方法,请使用给定链中的方法,从
my$objA=A->current
开始

或者,您可以直接将子例程添加到包的符号表中

*{A::new_method} = sub { say "A new method" };

$any_obj_of_A->new_method();

现在在所有现有实例和新实例上都可以使用。

但让我困惑的是,A前面没有符号。如果我们说A->current是一个对象,A开头不应该有$吗?
->左侧的单词将是自动stringifird。因此
A->method
A“->method
相同(除非存在名为
A
的子项),它们是自动字符串化的,是的,但这与不需要符号不是一回事?我指的是自动引用。再次查看我提供的示例。在这种情况下,让我问一个不同的问题:我们是否知道a(单独,没有->current)是类还是对象?
use Class::Inspector;

say "Filename: ", Class::Inspector->resolved_filename( 'A' );
my $objA = A->new();

eval q( sub A::get_info { print "$_\n" for (caller(0)) } );    
if ($@) { print "Eval: $@" };

eval q( sub A::boom { croak "Stacktrace: " } );
if ($@) { print "Eval: $@" };

$objA->get_info();

$objA->boom();
*{A::new_method} = sub { say "A new method" };

$any_obj_of_A->new_method();