gpt4 book ai didi

perl - 为什么我要使用 Perl 匿名子例程而不是命名的子例程?

转载 作者:行者123 更新时间:2023-12-03 12:22:45 25 4
gpt4 key购买 nike

我只是好奇为什么在 Perl 中选择使用匿名子例程而不是命名子例程。谢谢。

最佳答案

  • 您可以将匿名子存储在数组、散列和标量中。
  • 你可以在运行时构建它们
  • 您可以将它们作为参数传递给其他函数。
  • 您可以将变量保留在周围范围内。

  • 最后一点可能是最重要的,因为它通常是 Perl 中命名子例程与匿名子例程最出人意料的方面。例子:
    sub outer
    {
    my $a = 123;

    sub inner
    {
    print $a, "\n";
    }

    # At this point, $a is 123, so this call should always print 123, right?
    inner();

    $a = 456;
    }

    outer(); # prints 123
    outer(); # prints 456! Surprise!

    但是将“内部”从命名子例程更改为对匿名子例程的引用,并且它的工作方式并不令人惊讶:
    sub outer
    {
    my $a = 123;

    my $inner = sub
    {
    print $a, "\n";
    };

    # At this point, $a is 123, and since the anonymous subrotine
    # whose reference is stored in $inner closes over $a in the
    # "expected" way...
    $inner->();

    $a = 456;
    }

    # ...we see the "expected" results
    outer(); # prints 123
    outer(); # prints 123

    (当然,每个人的期望都不一样,所以“期望”周围的“恐吓引号”。)

    这是一个在实际代码中使用的示例(尽管应该注意, File::Find 接口(interface)通常被认为是一个糟糕的接口(interface)——因为它使用全局变量,而不是使用匿名子例程):
    sub find_files
    {
    my @files;

    my $wanted = sub
    {
    if($something)
    {
    push @files, $File::Find::name;
    }
    };

    # The find() function called here is imported from File::Find
    find({ wanted => $wanted }, $directory);

    return @files;
    }

    将命名子例程作为 wanted 参数的值传递将需要使用只能使用一次的例程来污染 namespace ,并且在 find_files() 子例程中定义命名子例程将表现出前面演示的“意外”行为。

    关于perl - 为什么我要使用 Perl 匿名子例程而不是命名的子例程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/834590/

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