【问题标题】:Query in Perl SubroutinesPerl 子程序中的查询
【发布时间】:2013-12-27 22:46:29
【问题描述】:

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

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

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

请帮忙...

【问题讨论】:

  • $val 必须在某处定义。它是某种对象。找到它被定义的地方,你就会找到答案。

标签: perl subroutine


【解决方案1】:

您所看到的不仅仅是一个子例程,而是一个名为$val对象 上的方法

我认为您可能会在程序顶部看到如下内容:

use Foo::Bar;   # Some Perl module

这个 Perl 模块将包含 方法 ReadSim。在您的代码中的某处,您可能会看到如下内容:

my $val = Foo::Bar->new;   # If the people who wrote this followed standards...

定义 $valFoo::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 哈希的引用。这就是大多数对象的定义方式。这几乎就是 constructor 所做的所有事情。它定义了对某事物的引用,然后祝福它为该对象类型。那么,方法只是获取已定义对象并对其进行操作的子例程。

$val-> ReadSim(...);

相当于:

Foo::Bar::ReadSim( $val, ... );

您对面向对象 Perl by Fire 的介绍就这么多。您仍然对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 并找出那个 subroutine ...我的意思是方法的作用。


最后一件事。如果您是 Perl 新手,您可能想查看一些 Perl 附带的教程。一个是Perl Reference Tutorial。本教程将告诉您有关参考的信息。在标准 Perl 中,存在三种不同类型的变量:标量、散列和数组。要创建更复杂的数据结构,您可以创建哈希的哈希或数组的哈希,或数组的数组等。本教程将教您如何做到这一点。

一旦您了解了参考资料,您应该阅读Perl Object Oriented Programming 上的教程。面向对象 Perl 使用引用来创建一个模拟 世界的面向对象编程设计。 (我说 simulated 因为有些人会争辩说面向对象的 Perl 并不是真正的面向对象,因为你没有私有方法和变量之类的东西。对我来说,如果你能从对象的角度思考和编程时的方法,它是面向对象的)。

【讨论】:

  • ++ 好答案。如果 Foo::Bar 没有 定义一个名为 ReadSim 的子程序,一个改进将是提及可能发生的情况。 ReadSim 可能被继承 (@ISA),或者可能在某处定义了 AUTOLOAD 方法。
  • @tobyink。你对@ISA(或use parent/base;)是正确的。还有Class::StructMoose。我应该提到Data::Dumperref 可以帮助确定$val 是什么类型的类。我希望找到ReadSim,如果没有,我将不得不更深入地研究 Perl OOP。
猜你喜欢
  • 2011-12-22
  • 1970-01-01
  • 2015-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多