3

想象一下这个子程序:

sub test(&&)
{
    my $cr1 = shift;
    my $cr2 = shift;
    $cr1->();
    $cr2->();
}

我知道我可以这样称呼它:test(\&sub1,\&sub2),但我怎么能这样称呼它:

test { print 1 },{ print 2 };

如果我说子程序只需要一个&,那么发送一个块就可以了。我不知道如何使它与2一起使用。

如果我尝试这样运行它,我会得到:

Not enough arguments for main::test at script.pl line 38, near "},"

编辑:没有就没有办法调用sub吗?

4

4 回答 4

12

你需要明确地说

test( sub { print 1 }, sub { print 2 } );

或者

test { print 1 } sub { print 2 };

隐含的“sub”仅适用于第一个参数。 http://perldoc.perl.org/perlsub.html#Prototypes

& 需要一个匿名子例程,如果作为第一个参数传递,则不需要 sub 关键字或后续逗号。

有些东西在那里使用了一个额外的词来伪造它:

test { print 1 } against { print 2 };

sub against (&) { $_[0] }
sub test (&@) { ... }

但我从来没有这么喜欢过。

于 2009-10-25T18:16:17.980 回答
8

你可以这样做:

test(sub { print 1 }, sub { print 2 });
于 2009-10-25T18:12:21.003 回答
1

我的一个程序中有以下代码:

sub generate($$$$)
{
    my ($paramRef, $waypointCodeRef, $headerRef,
        $debugCodeRef) = @_;
...
   &$headerRef();
...
       my $used = &$waypointCodeRef(\%record);

我称之为

CreateDB::generate(\%param, \&wayPointCode, \&doHeader, \&debugCode);
于 2009-10-25T18:14:52.840 回答
1

如果你真的想更多地弯曲语法,那么看看Devel::Declare

使用的模块示例Devel::Declare

CPAN 上依赖于 Devel::Declare的完整模块列表可以通过以下方式找到CPANTS

这是来自Test::Class::Sugar pod的示例:

use Test::Class::Sugar;

testclass exercises Person {
    # Test::Most has been magically included

    startup >> 1 {
        use_ok $test->subject;
    }

    test autonaming {
        is ref($test), 'Test::Person';
    }

    test the naming of parts {
        is $test->current_method, 'test_the_naming_of_parts';
    }

    test multiple assertions >> 2 {
        is ref($test), 'Test::Person';
        is $test->current_method, 'test_multiple_assertions';
    }
}

Test::Class->runtests;


这是PerlX::MethodCallWithBlock pod中的一些有趣的东西:

use PerlX::MethodCallWithBlock;

Foo->bar(1, 2, 3) {
  say "and a block";
};


与使用源过滤器(如Filter::Simple.

这是其作者的视频,可能会有所帮助。

/I3az/

于 2009-10-26T10:01:07.040 回答