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

时间:2017-10-18 12:01:15

标签: perl oop object

当我在编写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对象:Sebastian Vettel(30)

我的问题是。有没有办法访问创建的对象?

1 个答案:

答案 0 :(得分:10)

Person->new的调用由此解决:

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

Perl中的函数始终返回标量值。有时会有undef,有时标量的数量为零(这是一个空列表)。如果将这些值分配给变量,或者在需要表达式的其他内容中调用函数,则可以访问这些值。

my $foo = frobnicate();
print frobnicate();

Perl有一个警告,告诉您是否在其返回值无用的地方使用表达式。

考虑这个例子。

use warnings;
4;

这会给你一个警告。

  

在......

的void上下文中无用的常量(4)

但是对于函数调用,Perl并不真正知道是否会有返回值,因此无法对此进行警告。有时为了方便,函数会返回一些内容,例如open,您可以选择忽略返回值,或者可以将其用于错误检查。但最终,Perl不知道你是否打算这样做。

Person->new;

该函数调用的返回值在 void context 中被丢弃,而Perl不会抱怨,因为没有理由认为这是一个错误。

您无法访问此对象,它会被创建然后被丢弃。

唯一的例外是它位于sub的末尾,其中Perl隐式返回块的最后一个语句的返回值,这使得这样的事情成为可能。

sub build { Foo->new }

但在这种背景下,这不是你需要关注的事情。