2017-04-06 54 views
0

對我來說,Perl引用是一件很難理解的事情。在閱讀使用對象方法的類OO腳本時,我從來沒有看到用作參考的對象。即使對於大對象,也可以從被用作參考而不是被複制到子程序(方法)中受益。Perl方法和通過引用

PerlMaven說:

$p->a_method($value); 

在幕後,Perl的運行

a_method($p, $value); 

但如果$p是巨大的物體,也不會想要把它作爲一個參考?

a_method(\$p, $value) 

我一直都明白,如果對象很大,通過引用可以導致顯着的速度增加。在面向對象中,很可能你正在處理大型對象(例如巨大的XML::Twig)。那麼當你真的把它作爲子程序的參考傳遞時,你如何在這樣的對象上調用一個方法?

+1

尼特:'$ P-> a_method($值)'不一定需要在當前包子作爲報價暗示。 '$ p-> a_method($ value)'更接近'my $ sub = $ p-> can('a_method') - >($ p,$ value);' – ikegami

+2

'$ p'是一個引用(a你不能算術的指針),並且引用通過引用傳遞(因爲所有參數都是通過Perl中的引用傳遞的)。這兩個(獨立地)使對象的大小與方法調用無關,前者使對象的大小與'my $ self = shift'無關。 – ikegami

回答

9

$p已包含對該對象的引用。方法調用需要對該對象的引用,並且它是傳遞給該子對象的引用。所以,$ self總是一個參考。見perlobjbless

#! /usr/bin/perl 
use strict; 
use warnings; 
use feature 'say'; 

{ package Class; 

    sub new { bless {}, __PACKAGE__ } 
    sub inf { ref shift } 
} 

my $o = 'Class'->new; 
say $o->inf ? 'reference' : 'not a reference'; 

輸出:

reference 
+0

謝謝,我找不到任何關於此事的信息。 PerlMaven的例子也讓我更加困惑,因爲它是如何被重寫的,似乎它是通過價值傳遞的。 –

+0

嗯,它是 - 但只是因爲「參考」是一個值。有點像指針。 (雖然並非完全)。 – Sobrique

+0

@Bram Vanroy,Re「*它似乎是通過值傳遞的*」,所有參數都通過Perl中的引用傳遞,雖然我們通常會繼續複製它們('my($ arg)= @_;') 。 – ikegami