标签: coderef

为什么Perl允许在未经处理的数据结构上调用coderef?

执行语句时$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
Run Code Online (Sandbox Code Playgroud)

那为什么它与coderef一起工作?:

my $process = \&process;    # Same method as before
$data->$process( @params ); # Works fine now
Run Code Online (Sandbox Code Playgroud)

methods perl coderef

8
推荐指数
3
解决办法
1430
查看次数

当我将coderef传递给这个原型Perl子例程时,为什么会出现语法错误?

这是代码:

sub function($&) {
    my $param1 = shift;
    my $code = shift;
    # do something with $param1 and $code
}
Run Code Online (Sandbox Code Playgroud)

如果我试着像这样打电话:

function("whatever") {
    print "i'm inside the coderef\n";
}
Run Code Online (Sandbox Code Playgroud)

我得到Not enough arguments for MyPackage::function at x.pl line 5, near ""whatever" { ".如何在不必添加sub代码块前调用它?

perl reference coderef

7
推荐指数
1
解决办法
212
查看次数

哪些推荐的Perl模块可以序列化Moose对象?

我平时用Storablenstore,但现在我有一个模块CODE,显然Storable不喜欢这样.

我发现YAML(而YAML::XS我真的不能去上班).我还对MooseX :: Storage进行了一些实验,没有取得多大成功.

还有其他选择吗?你会推荐什么?

perl serialization yaml moose coderef

3
推荐指数
1
解决办法
1228
查看次数

Perl Mojolicious:将参数传递给代码引用

在我的 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]} @_;
    });
Run Code Online (Sandbox Code Playgroud)

这有效,我可以将参数(例如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( …
Run Code Online (Sandbox Code Playgroud)

syntax perl coderef promise mojolicious

2
推荐指数
1
解决办法
86
查看次数

是否可以在Perl中的哈希构造函数中定义匿名子例程?

是否可以在Perl中的哈希构造函数中定义匿名子例程?

我正在尝试做这样的事情:

my %array = { one   => sub { print "first $_[0]" },
              two   => sub { print "next  $_[0]" },
              three => sub { print "last  $_[0]" }};

$array{$foo}->('thing');
Run Code Online (Sandbox Code Playgroud)

但它没有用.代码似乎运行和编译,但数组中的值是空白的.如果我这样做:

my %array;

$array{'one'}   = sub { print "first $_[0]" };
$array{'two'}   = sub { print "next  $_[0]" };
$array{'three'} = sub { print "last  $_[0]" };

$array{$foo}->('thing');
Run Code Online (Sandbox Code Playgroud)

然后它似乎工作正常.所以我有一个解决方法,但它只是困扰我,我想知道是否有人知道它是否可能,如果是,那么语法是什么.

perl hash coderef

1
推荐指数
2
解决办法
1244
查看次数

perl subs 什么时候将参数作为 `$_` 传递,什么时候是 `$_[0]` ?

我注意到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{$_} = …
Run Code Online (Sandbox Code Playgroud)

perl coderef

1
推荐指数
1
解决办法
168
查看次数

标签 统计

coderef ×6

perl ×6

hash ×1

methods ×1

mojolicious ×1

moose ×1

promise ×1

reference ×1

serialization ×1

syntax ×1

yaml ×1