当我在编写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)
我的问题是。有没有办法访问创建的对象?
答案 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 }
但在这种背景下,这不是你需要关注的事情。