我要使用perl作为实习的一部分,我遇到过这段代码,无法理解这可能意味着什么。
$val->ReadSim($first_sim, \&DataProcessing);
在脚本中,定义了子程序DataProcessing,但找不到ReadSim。我尝试在我们的基础设施中搜索,但无法进行搜索。这是在一周前让我理解的,我不能在不失去学分的情况下向导游询问......
请帮忙......
答案 0 :(得分:7)
您所看到的不仅仅是一个子程序,而是一些名为$val
的对象上的方法。
我认为你可能会在程序之上看到这样的东西:
use Foo::Bar; # Some Perl module
此Perl模块将包含方法 ReadSim。在代码的某处,您可能会看到类似这样的内容:
my $val = Foo::Bar->new; # If the people who wrote this followed standards...
此将 $val
定义为Foo::Bar
的对象。如果您查看包Foo::Bar
,您会看到类似这样的内容:
#! Foo/Bar.pm
package Foo::Bar;
use strict; # Because I'm an optimist
use warnings;
...
sub new {
my $class = shift;
...
my $self = {};
...
bless $self, $class;
...
return $self; # May simply be bless {}, $class;
}
然后再往下看,你会看到:
sub ReadSim {
my $self = shift;
...
}
$self = {}
是Perl哈希的引用。这就是定义大多数对象的方法。几乎所有构造函数都是如此。它定义了对某事物的引用,然后祝福它作为该对象类型。然后,方法只是获取已定义对象并对其进行操作的子例程。
$val-> ReadSim(...);
相当于:
Foo::Bar::ReadSim( $val, ... );
非常适合您对Fire的面向对象Perl的介绍。您仍然对ReadSim
的含义有疑问。
如果一切正常,那个模块的开发人员应该已经创建了内置的名为 POD 的Perl文档。首先,确定对象$val
的类型。查看定义$val
的位置(类似于my $val = Foo::Bar->new(...);
)。 Foo::Bar
是$val
所属的类。您可以从命令行执行此操作:
$ perldoc Foo::Bar
而且,如果你很幸运,你会看到打印出Foo::Bar
的文档。如果你真的非常幸运,你也会看到ReadSim
也会做的事。
而且,如果你没那么幸运,你将不得不做一些挖掘。你可以这样做:
$ perldoc -l Foo::Bar
/usr/perl/lib/perl5/5.12/Foo/Bar.pm
这将打印出 Perl模块所在系统的位置。例如,在这种情况下,模块的代码位于/usr/perl/lib/perl5/5.12/Foo/Bar.pm
。现在,您可以使用此文件上的编辑器来读取它,并搜索sub ReadSim
并找出子例程 ...我的意思是方法。
最后一件事。如果您是Perl的新手,您可能需要查看Perl附带的一些教程。一个是Perl Reference Tutorial。本教程将告诉您有关参考的信息。在标准Perl中,有三种不同类型的变量:标量,散列和数组。要创建更复杂的数据结构,可以创建哈希或哈希数组或数组数组等的哈希值。本教程将教您如何执行此操作。
了解参考文献后,您应该阅读Perl Object Oriented Programming上的教程。面向对象的Perl使用引用来创建模拟面向世界对象的编程设计。 (我说模拟因为有些人会认为面向对象的Perl并不是真正的面向对象,因为你没有像私有方法和变量这样的东西。对我来说,如果你能用对象来思考和你编程的方法一样,它是面向对象的。)