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构造函数的东西。 。
答案 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;