执行语句时$obj->method();,perldiag说Perl需要知道方法属于哪个包.这就是为什么它需要得到祝福:
无法在未完成的引用上调用方法"%s"
(F)方法调用必须知道它应该运行在哪个包中.它通常从您提供的对象引用中找到它,但在这种情况下您没有提供对象引用.在被祝福之前,引用不是对象引用.见
perlobj.
因此,不可能执行以下操作:
my $data = [
             [ 1, 2, 3 ],
             [ 4, 5, 6 ],
           ];
$data->process( @params );  # Can't call method "process" on unblessed reference
那为什么它与coderef一起工作?:
my $process = \&process;    # Same method as before
$data->$process( @params ); # Works fine now
这是代码:
sub function($&) {
    my $param1 = shift;
    my $code = shift;
    # do something with $param1 and $code
}
如果我试着像这样打电话:
function("whatever") {
    print "i'm inside the coderef\n";
}
我得到Not enough arguments for MyPackage::function at x.pl line 5, near ""whatever" { ".如何在不必添加sub代码块前调用它?
我平时用Storable用nstore,但现在我有一个模块有CODE,显然Storable不喜欢这样.
我发现YAML(而YAML::XS这我真的不能去上班).我还对MooseX :: Storage进行了一些实验,但没有取得多大成功.
还有其他选择吗?你会推荐什么?
在我的 Mojolicious 控制器中,我有:
my @promise;
foreach my $code (\&doit1, \&doit2,) {
    my $prom = Mojo::Promise->new;
    Mojo::IOLoop->subprocess(
    sub {
        my $r = $code->("Hello");
        return $r;
    },
    sub {
        my ($subprocess, $err, @res) = @_;
        return $prom->reject($err) if $err;
        $prom->resolve(@res);
    },
    );
    push @promise, $prom;
}
Mojo::Promise
    ->all(@promise)
    ->then(
    sub {
    my ($result1, $result2) = map {$_->[0]} @_;
    });
这有效,我可以将参数(例如Hello)传递给我的子程序。
现在我皈依doti1()并doit2()成为帮手。所以代码看起来像:
foreach my $code (sub {$self->myhelper->doit1("Goodbye")},
                  sub {$self->myhelper->doit2("Good night")},
    ) {
    my $prom = Mojo::Promise->new;
    Mojo::IOLoop->subprocess( …是否可以在Perl中的哈希构造函数中定义匿名子例程?
我正在尝试做这样的事情:
my %array = { one   => sub { print "first $_[0]" },
              two   => sub { print "next  $_[0]" },
              three => sub { print "last  $_[0]" }};
$array{$foo}->('thing');
但它没有用.代码似乎运行和编译,但数组中的值是空白的.如果我这样做:
my %array;
$array{'one'}   = sub { print "first $_[0]" };
$array{'two'}   = sub { print "next  $_[0]" };
$array{'three'} = sub { print "last  $_[0]" };
$array{$foo}->('thing');
然后它似乎工作正常.所以我有一个解决方法,但它只是困扰我,我想知道是否有人知道它是否可能,如果是,那么语法是什么.
我注意到Parallel::Loops模块用作$_其 subref 的参数。这个问题与Parallel::Loops本身无关,而是与 coderef 调用约定有关。
这是他们的示例,请注意$_传递给子:
$pl->foreach( \@parameters, sub {
    # This sub "magically" executed in parallel forked child
    # processes
 
    # Lets just create a simple example, but this could be a
    # massive calculation that will be parallelized, so that
    # $maxProcs different processes are calculating sqrt
    # simultaneously for different values of $_ on different CPUs
    # (Do see 'Performance' / 'Properties of the loop body' below)
 
    $returnValues{$_} = …