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