2013-10-18 76 views
3

我試圖在Perl中使用OO。我做了如下瑣碎類:爲什麼我不能在新的裏面初始化成員變量?

#/usr/bin/perl 
package Tools::Util; 
use strict; 
use warnings; 

my $var; 

sub new { 
    my ($class, $arg) = @_; 
    my $small_class = { 
     var => $arg, 
    }; 
    return bless $small_class;  
} 

sub print_object { 
    print "var = $var\n"; #this is line 20 
} 

1; 

這是一個測試腳本:

#!/usr/bin/perl 
use strict; 
use warnings; 
use Tools::Util; 

my $test_object = new Tools::Util("Some sentence"); 
$test_object->print_object(); 
use Data::Dumper; 
print Dumper($test_object); 

結果我得到的是:

Use of uninitialized value $var in concatenation (.) or string at Tools/Util.pm line 20. 
var = 
$VAR1 = bless({ 
       'var' => 'Some sentence' 
       }, 'Tools::Util'); 

我不明白這一點。我認爲Perl中的對象是哈希值,所以我可以在沒有$的情況下使用相同的名稱訪問/初始化成員變量。爲什麼在這種情況下,$var未初始化,但我轉儲包含該值的散列?
我應該如何使用/初始化/處理成員變量以及我在這裏誤解了什麼?

+3

幾乎可以確定你想要'祝福$ OBJ,$ class'而不僅僅是'祝福$ obj'。 – pilcrow

+5

sidenote,'bless $ small_class,$ class;'更適合繼承,'Tools :: Util-> new(「Some sentence」)'優於間接語法。 –

回答

4

$var是詞法類變量,在您的示例中未定義。

你可能想:

sub print_object { 
    my $self = shift; 
    print "var = $self->{var}\n"; 
} 
+0

但我想在構造函數new中初始化'$ var'。是不是'$ var'成員變量?它與'$ self - > {var}'不一樣嗎? – Cratylus

+0

他們不一樣;首先是簡單的詞彙,第二個是'$ test_object' hashref/object中的關鍵字。 –

+0

老實說,我不太確定我明白你的意思是「簡單的詞彙」。我想我更多地考慮其他語言 – Cratylus

3

的Perl不處理不少,你已經習慣了以同樣的方式對象的方法。

您是否熟悉許多面向對象語言使用的隱含的this參數?如果不是的話,現在將是閱讀它的好時機。

下面是掩蓋了細節五秒介紹:

//pretend C++ 

//this function signature 
MyClass::MyFunction(int x); 

//is actually more like the following 
MyClass::MyFunction(MyClass this, int x); 

當您訪問類的實例成員,my_var相當於this.my_var

在Perl中,您可以手動執行此操作!變量$var而不是相當於$self->{var}

你的祝福對象實際上是一個哈希引用,並可以像這樣訪問。當你打電話給$test_object->print_object()時,sub獲得值$test_object作爲第一個參數。大多數Perl程序員處理這種像這樣:

sub my_method { 
    my $self = shift; #shift first argument off of @_ 
    print $self->{field}; 
} 

考慮到這一點,你應該重寫你的print_object子匹配mpapec's answer

延伸閱讀:perlsubperlobj

+0

Hm ... 。我知道什麼是'這個'。有趣的比喻。 – Cratylus

相關問題