如何将子程序转换为perl / perl5中的对象/包?

时间:2013-03-22 02:16:50

标签: perl oop perl5

main.pl

#!/usr/bin/perl
use strict;
use warnings;
use v5.14;
use ReadData;

my $read = ReadData->new();
my @name = $read->getNames();
$read->printNames(@name);

ReadData.pm

#!/usr/bin/perl
package ReadData;
use strict;
use warnings;
use v5.14;

#

sub new {
    my $class = shift;
    my $self = {};
    bless $self, $class;
    return($self);
}

sub getNames {
    # read in data
    my @data;
    print "\nName of first matrix? ";
    chomp($data[0] = <>);
    print "\nName of second matrix? ";
    chomp($data[1] = <>);
    return(@data);
}

sub printNames {
    my @name = @_;
    print "\nname1: " . $name[0];
    print "\nname2: " . $name[1];
}

1;

我在主程序的另一个版本中有这些子程序,一切正常。我没有调用该对象,输入名称在输出中正确反映,如下所示:

my @name = getNames();
printNames(@name);

sub getNames { same as above . . . }
sub printNames{ same as above . . . }

我在最顶层技术上粘贴的代码,因为它运行并输出,但输出不正确。

当我输入“A”作为名字,而“B”作为第二个名字时,这就是我得到的:

>>> perl alt.pl

Name of first matrix? A

Name of second matrix? B

name1: ReadData=HASH(0x1d082f0)
name2: A

任何人都可以帮我解决这个问题吗?我一直在网上阅读50个perl教程,我无法将自己的大脑包裹在我应该做的事情上。我唯一的其他真正的编程经验是Java中的OOP,我不遵循这个perl构造函数的东西。 。

2 个答案:

答案 0 :(得分:2)

我认为您缺少的主要是当您在对象上调用方法时:

$read->printNames(@name);

在所有常规参数之前,对象本身($read)作为第一个参数传递给方法(printNames)。 (在Java中,这是隐式发生的 - 对象只是神奇地提供为this - 但在Perl中它是显式的 - 对象是$_[0]。)因此,您可以将printNames更改为:

sub printNames {
    my $this = shift;
    my @name = @_;
    print "\nname1: " . $name[0];
    print "\nname2: " . $name[1];
}

(当然,在Perl中,就像在Java中一样,实例方法更常见的是与对象有关。你的printNames方法很奇怪,因为它根本不使用$this但是这应该让你开始。)

答案 1 :(得分:0)

您可能希望将数据存储在对象中,而不是来回复制它:

<强> alt.pl:

#!/usr/bin/perl
use strict;
use warnings;
use ReadData;

my $read = ReadData->new();
$read->getNames();
$read->printNames();

<强> ReadData.pm:

package ReadData;
use strict;
use warnings;

#

sub new {
    my $class = shift;
    my $self = {};
    bless $self, $class;
    return($self);
}

sub getNames {
    my $self = shift;
    # read in data
    print "\nName of first matrix? ";
    chomp($self->{name1} = <>);
    print "\nName of second matrix? ";
    chomp($self->{name2} = <>);
    return;
}

sub printNames {
    my $self = shift;
    print "\nname1: " . $self->{name1};
    print "\nname2: " . $self->{name2};
}

1;