1

主要.pl

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

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

读取数据.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 构造函数的东西。. .

4

2 回答 2

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。但这应该让你开始。)

于 2013-03-22T02:22:02.680 回答
0

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

替代品:

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

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

读取数据.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;
于 2013-03-22T04:40:45.400 回答