如果没有分配给任何变量,对象是否可访问?

问题描述:

我在编写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

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 } 

但这并不是您需要关注的内容。