2017-10-18 61 views
2

我在編寫Perl腳本時,出現了一個問題,只是出於好奇。我注意到,當我創建一個對象而不將它分配給任何變量(標量/數組/散列)時,不會出現任何警告或錯誤。如果沒有分配給任何變量,對象是否可訪問?

例如:

Person->new ('Sebastian', 'Vettel', 30); 

的MCVE如下。

use strict; 
use warnings; 

package Person; 
sub new { 
    my $class = shift; 
    my $self = { 
    FirstName => shift, 
    LastName => shift, 
    Age  => shift, 
    }; 
    print "Created a Person object: $self->{FirstName} ", 
     "$self->{LastName} ($self->{Age})\n"; 
    bless $self, $class; 
    return $self; 
} 

Person->new ('Sebastian', 'Vettel', 30); 

輸出:

創建一個Person對象:維泰爾(30)

我的問題是這一點。有沒有辦法訪問創建的對象?

+1

添加'subdestroy {print「Destroyed \ n」; }'到'package'和'<>;''Person-> new'後面自己看。 – ikegami

+0

@ikegami我試過並看到了。謝謝。 – ahmedus

回答

10

Person->new的調用是引擎蓋下解決,因爲這:在Perl

Person::new('Person', 'Sebastian', 'Vettel', 30); 

函數總是返回標量值。有時候有一個undef,有時標量的數量是零(這是一個空列表)。如果將這些值分配給變量,或者在需要表達式的其他內容中進行函數調用,則這些值將變爲可訪問。

​​

Perl有一個警告,告訴你如果在返回值無用的地方使用表達式。

考慮這個例子。

use warnings; 
4; 

這會給你一個警告。

沒用使用恆定的(4)在無效的情況下...

但對於一個函數調用,Perl並不真正知道是否會有一個返回值,所以它不能警告這一點。有時候函數返回一些方便的東西,比如open,你可以選擇忽略返回值,或者你可以使用它來進行錯誤檢查。但最終,Perl並不知道你是否打算這麼做。

Person->new; 

該函數調用的返回值,簡單地丟棄在無效的情況下和Perl不抱怨,因爲沒有理由認爲這是一個錯誤。

您不能訪問此對象,它會被創建並丟棄。


唯一的例外是,如果它在一個子,其中隱含的Perl返回塊,這使得這樣的事情可能的最後一條語句的返回值的末尾。

sub build { Foo->new } 

但這並不是您需要關注的內容。

相關問題