2013-03-22 62 views
1

main.pl如何將子例程轉換爲perl/perl5中的對象/軟件包?

#!/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; 

我在主程序的另一個版本這些子程序,和一切工作正常那裏。我不叫的對象,輸入名稱在輸出看到bleow正確反映:

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

我認爲你缺少的主要事情是,當你調用對象的方法上:

$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,但這應該讓你開始。)

+0

啊謝謝!我知道有些東西是我錯過的。 。 。 奇怪的是,我沒有使用任何東西,但這只是一些原型,我測試創建/調用一個新的對象從主腳本導出到新的包/模塊後的子程序。 我沒有任何需要使用/調用該打印方法,它基本上只是在那裏,以確保包/對象工作正常,我什麼也沒有搞亂:P – user1947267 2013-03-22 02:34:22

+0

@ user1947267:不客氣!並且 - 理解。圖形填充代碼並不總是現實的。 :-) – ruakh 2013-03-22 02:40:01

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; 
+0

這很酷,tyvm! – user1947267 2013-03-24 04:51:30

相關問題