gpt4 book ai didi

perl - 什么时候应该使用子程序属性?

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

我根本不了解 Perl 子例程属性。

我从未在实际代码中见过它们, perldoc perlsub perldoc attributes 无法回答我的问题:

  • 属性有什么用?
  • 他们带来了哪些 Perl 最佳实践中还没有的东西?
  • 是否有任何使用属性的 CPAN 模块(众所周知的或其他的)?

  • 如果有人可以将属性的详细示例放在一起,那就太好了。

    对于和我一样一无所知的人,属性是 中冒号后面的参数。 attributes SYNOPSIS 下面的例子:
    sub foo : method ;
    my ($x,@y,%z) : Bent = 1;
    my $s = sub : method { ... };

    use attributes (); # optional, to get subroutine declarations
    my @attrlist = attributes::get(\&foo);

    use attributes 'get'; # import the attributes::get subroutine
    my @attrlist = get \&foo;

    最佳答案

    属性允许您注释变量以在幕后执行自动魔术。一个类似的概念是java annotations .这是一个可能有帮助的小例子。它使用 Attribute::Handlers创建 loud属性。

    use Attribute::Handlers;

    sub UNIVERSAL::loud : ATTR(CODE) {
    my ( $pkg, $sym, $code ) = @_;
    no warnings 'redefine';
    *{$sym} = sub {
    return uc $code->(@_);
    };
    }

    sub foo : loud {
    return "this is $_[0]";
    }

    say foo("a spoon");
    say foo("a fork");

    每当使用 loud 声明子时属性 UNIVERSAL::loud回调触发在 sub 上暴露元信息。我重新定义了函数来实际调用一个匿名子,后者又调用原始子并将其传递给 uc
    这输出:
    THIS IS A SPOON
    THIS IS A FORK

    现在让我们看一下 SYNOPSIS 中的变量示例。 :
    my ($x,@y,%z) : Bent = 1;

    在不考虑我们拥有的属性的情况下将其分解为小的 perl 语句
    my $x : Bent
    $x = 1;

    my @y : Bent
    @y = 1;

    my %Z : Bent
    %z = 1;

    我们现在可以看到,每个变量都以简洁的方式被赋予了 Bent 注释,同时也为所有变量分配了值 1。下面是一个可能更有趣的例子:
    use Attribute::Handlers;
    use Tie::Toggle;

    sub UNIVERSAL::Toggle : ATTR(SCALAR) {
    my ($package, $symbol, $referent, $attr, $data, $phase) = @_;
    my @data = ref $data eq 'ARRAY' ? @$data : $data;
    tie $$referent, 'Tie::Toggle', @data;
    }

    my $x : Toggle;

    say "x is ", $x;
    say "x is ", $x;
    say "x is ", $x;

    哪个输出:
    x is 
    x is 1
    x is

    您可以使用它来进行日志记录、创建测试注释、将类型详细信息添加到变量、语法糖、做 moose-ish 角色组合和许多其他很酷的事情。

    另请参阅此问题: How do Perl method attributes work? .

    关于perl - 什么时候应该使用子程序属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8455997/

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