在Perl子例程中查询

时间:2013-12-10 12:07:41

标签: perl subroutine

我要使用perl作为实习的一部分,我遇到过这段代码,无法理解这可能意味着什么。

$val->ReadSim($first_sim, \&DataProcessing); 

在脚本中,定义了子程序DataProcessing,但找不到ReadSim。我尝试在我们的基础设施中搜索,但无法进行搜索。这是在一周前让我理解的,我不能在不失去学分的情况下向导游询问......

请帮忙......

1 个答案:

答案 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并不是真正的面向对象,因为你没有像私有方法和变量这样的东西。对我来说,如果你能用对象来思考和你编程的方法一样,它是面向对象的。)