gpt4 book ai didi

perl - 在子例程中通过引用操作 Perl 对象

转载 作者:行者123 更新时间:2023-12-01 08:53:47 25 4
gpt4 key购买 nike

我有一个 Perl 程序和包 WorkerLog

Worker 几乎完成了所有计算,我想通过引用 Worker 子例程来传递一个对象,以及一些其他参数(标量和数组)。我见过像 this 这样的例子和 this .

他们通过将 @_ 放入 subs 中,然后操作对象来处理这个问题。我还找到了一种通过使用索引来操作它们的方法,例如 @{$_[i]}。问题是,当我尝试这样的代码时,出现错误:无法在 ... 的 unblessed 引用上调用方法“write”

下面的代码片段。

主要:

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);

worker :

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# 中,这是以不同的方式处理的 - 您可以通过值或通过引用将参数发送到方法,然后在专门的方法中执行您想要的操作(方法被预先编写为通过引用处理参数或值(value))。我认为在 Perl 中使用 \parameter 发送将发送引用。

最佳答案

对象是引用。引用是标量值。

如果您想将数组或哈希传递到子例程中,那么您通常需要传递对它们的引用 - 因为 Perl 参数传递对标量值的效果要好得多。

$log 已经是对您的对象的引用。因此,您不需要引用它。您最终将引用传递给引用。因此,当您将该参数复制到子例程中的 $log 中时,您将获得额外的、不必要的引用级别。

解决方法是将 $log 标量传递给子例程。

$worker->subFromWorker($scalar, $log, \@array); # $log, not \$log

然后一切都会正常工作。

关于perl - 在子例程中通过引用操作 Perl 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33236556/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com