【发布时间】:2015-10-20 12:21:41
【问题描述】:
我有一个 Perl 程序和包 Worker 和 Log。
Worker 几乎完成了所有计算,我想通过引用 Worker 子例程来传递一个对象,以及一些其他参数(标量和数组)。我见过像this 和this 这样的例子。
他们通过将@_ 放入 subs 中,然后操作对象来处理这个问题。我还找到了一种使用索引来操作它们的方法,例如@{$_[i]}。问题是,当我尝试这样的代码时,出现错误:
Can't call method "write" on unblessed reference at ...
下面的代码 sn-ps。
主要:
use strict;
use warnings;
use Log;
use Worker;
my $log = Log->new();
my $worker = Worker->new();
my $scalar = "SomeURLhere";
my @array = ('red','blue','white');
# I do some stuff with $log object
#...
# Now I want to pass data to the Worker
$worker->subFromWorker($scalar, \$log, \@array);
工人:
use strict;
use warnings;
package Worker;
sub new {
my $class = shift;
my $self = {};
bless $self, $class;
return $self;
}
sub subFromWorker{
my ($self) = shift;
my $scalar = $_[0];
#my ($log) = $_[1];
my @array = @{$_[2]};
foreach my $item (@array){
print $item;
}
$_[1]->write("The items from url $scalar are printed.");
#Same thing happens if I use $log here
}
在 C# 中,这是以不同的方式处理的 - 您可以通过值或通过引用将参数发送到方法,然后在专门的方法中执行您想要的操作(方法预先编写以通过引用或价值)。我认为在 Perl 中使用 \parameter 发送将发送参考。
【问题讨论】:
-
当你说你有一个包
Main你的意思是它是你的程序吗?它应该在*.pl文件中 -
@Borodin 一个程序,我来修改问题。
-
"(方法是预先编写的,通过引用或值来处理参数)" 和Perl完全一样。如果您通过引用传递一个对象(尽管这样做很奇怪),那么您必须在方法中这样对待它。如果你通过
\$log,那么你将不得不写${$log}->write( ... )(假设你已经用my $log = $_[1]从参数中拉出$log) -
Re “在 C# 中,这是以不同的方式处理的——你可以通过值或引用向方法发送参数”,Perl 总是通过引用传递
标签: perl object reference perl-module subroutine