簡體   English   中英

如何將函數傳遞給Perl子?

[英]How can I pass a function to a Perl sub?

我怎么寫一個接受像map函數那樣的函數呢?

例:

$func = sub { print $_[0], "hi\n" };
&something($f);
sub something
{
    my $func = shift;
    for ($i = 0; $i < 5; $i++)
    {    $func->($i);    }
}

工作正常。

但是如果我這樣做的話

&something( { print $_[0], "hi\n" } );

它不會工作,並說func是一個未定義的參考。

所以我的問題是如何編寫一個接受perls map函數等參數的函數?

map { s/a/b/g } @somelist;

map函數具有非常神奇的語法,除非你有充分的理由,否則你可能不想復制它。 只需使用常規的匿名子,如下所示:

something(sub { print $_[0], "hi\n" });

但是,如果你真的想這樣做,你需要使用原型

sub my_map (&@) {
    my ($func, @values) = @_;
    my @ret;
    for (@values) {
        push @ret, $func->($_);
    }
    return @ret;
}

my @values = my_map { $_ + 1 } qw(1 2 3 4);
print "@values";  # 2 3 4 5

(注意$_是動態范圍的,因此它在調用者中的任何值都保留在函數中。)

List::UtilList::MoreUtils做了很多這樣的事情來創建看起來內置的函數,並且像map / grep變體一樣。 這是唯一一個應該使用這種東西的情況。

首先,在調用sub時不要使用& 來自perldoc perlsub

子程序可以遞歸調用。 如果一個子程序使用被叫&形式,參數列表是可選的,如果省略,沒有@_陣列設置為子程序:在@_數組在調用的時候是可見的,而不是子程序。 這是新用戶可能希望避免的效率機制。

如果您希望能夠將普通塊傳遞給“ sub something ”,則需要使用原型,如下所示:

sub something(&@);

# later

sub something(&@) {
    my ($coderef, @args) = @_;

}

請參閱原型

我個人只會傳遞一個明確的subref:

something( sub { } );
&something( { print $_[0], "hi\n" } );
#           ^^^ this isn't a reference

&something( sub { print $_[0], "hi\n" } ); # works just fine

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM