当我在研究Perl脚本时,出现了一个问题只是为了好奇.我注意到,当我创建一个对象而没有将其分配给任何变量(标量/数组/散列)时,不会出现警告或错误.
例如:
Person->new ('Sebastian', 'Vettel', 30);
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
输出:
创建了一个Person对象:Sebastian Vettel(30)
我的问题是.有没有办法访问创建的对象?
sim*_*que 10
没有.
一个电话Person->new是在幕后解决,因为这:
Person::new('Person', 'Sebastian', 'Vettel', 30);
Run Code Online (Sandbox Code Playgroud)
Perl中的函数始终返回标量值.有时会有一个undef,有时标量的数量为零(这是一个空列表).如果将这些值分配给变量,或者在需要表达式的其他内容中调用函数,则可以访问这些值.
my $foo = frobnicate();
print frobnicate();
Run Code Online (Sandbox Code Playgroud)
Perl有一个警告,告诉您是否在其返回值无效的地方使用表达式.
考虑这个例子.
use warnings;
4;
Run Code Online (Sandbox Code Playgroud)
这会给你一个警告.
在void上下文中无用的常量(4)...
但是对于函数调用,Perl并不真正知道是否会有返回值,所以它无法对此发出警告.有时函数返回一些东西是为了方便,比如open,你选择忽略返回值,或者你可以用它来进行错误检查.但最终,Perl不知道你是否打算这样做.
Person->new;
Run Code Online (Sandbox Code Playgroud)
该函数调用的返回值在void上下文中被简单地丢弃,并且Perl不会抱怨,因为没有理由认为这是一个错误.
您无法访问此对象,它会被创建然后被丢弃.
唯一的例外是如果它位于sub的末尾,其中Perl隐式返回块的最后一个语句的返回值,这使得这样的事情成为可能.
sub build { Foo->new }
Run Code Online (Sandbox Code Playgroud)
但在这种情况下,这不是你需要关心的事情.