加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – 什么时候应该使用子例程属性?

发布时间:2020-12-15 21:20:48 所属栏目:大数据 来源:网络整理
导读:我根本不填写Perl子程序属性。 我从来没有见过他们在实际的代码和 perldoc perlsub 和 perldoc attributes 没有回答我的问题: 什么是有用的属性? 他们带给Perl最佳实践中还没有的表格是什么? 是否有任何使用属性的CPAN模块(众所周知的或其他的)? 如果有
我根本不填写Perl子程序属性。

我从来没有见过他们在实际的代码和perldoc perlsubperldoc attributes没有回答我的问题:

什么是有用的属性?
>他们带给Perl最佳实践中还没有的表格是什么?
>是否有任何使用属性的CPAN模块(众所周知的或其他的)?

如果有人可以把他们应该使用的属性的一个详细的例子放在一起,那将是很好的。

对于那些像我一样无知的人,属性是属性中的冒号之后的参数概要示例如下:

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创建响亮的属性。
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");

每当一个sub被声明为大声的属性时,UNIVERSAL :: loud回调触发在sub上显示元信息。我重新定义了这个函数,实际上调用一个匿名子类,这个子进程调用原来的子代并将其传递给uc

输出:

THIS IS A SPOON
THIS IS A FORK

现在我们来看一下SYNOPSIS中的变量示例:

my ($x,%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;

哪些输出:

x is 
x is 1
x is

您可以使用它来进行日志记录,创建测试注释,向变量添加类型细节,语法糖,做moose-ish角色组合以及许多其他很酷的东西。

还看到这个问题:How do Perl method attributes work?。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读