幸运蛋蛋pc开奖
今天小编就为大家分享一篇关于Perl5和Perl6对比使用Sigils的差别,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

我们将看到Sigls(变量名称开头处的符号)Perl 5和Perl 6之间的差别。

概述

让我们从Perl 5和Perl 6中的Sigils概述开始:

符号Perl5Perl6
@Array Positional
%Hash Associative
Subroutine Callable
Scalar Item
TypeglobN/a

@(Array vs. Positional)

在perl 5中定义数组时,可以创建一个可扩展的标量值列表,并给它一个带有sigil的名称。@:

# Perl 5
my @foo = (1,2,3);
push @foo, 42;
say for @foo; # 1␤2␤3␤42␤

在perl 6中定义数组时,将创建一个新的列阵对象和绑定它以词法垫中的那个名字输入条目。因此:

# Perl 6
my @foo = 1,2,3;
push @foo, 42;
.say for @foo; # 1␤2␤3␤42␤

在功能上与Perl 5中相同。然而,第一行是用于:

# Perl 6
my @foo := Array.new( 1,2,3 );

这将绑定(而不是赋值)一个新的列阵对象指向词汇定义的名称。@foo。这,这个,那,那个@perl 6中的sigil表示一个类型约束:如果您想用该sigil将某个东西绑定到lexpad条目中,则它必执行位置角色。要确定一个类是否使用SmartMatch执行某个角色并不困难:

# Perl 6
say Array ~~ Positional; # True

您可以认为perl 6中的所有数组都是以与绑定阵列在Perl 5中实现。而这也离事实不远。如果不深入细节,一个简单的例子可能会澄清这一点。这,这个,那,那个at-POS方法是实现位置角色。每当需要访?#23454;?#20010;元素时,都会调用此方法。所以,当你写:

say @a[42]

你正在执行:

say @a.AT-POS(42)

?#27604;唬?#36825;不是唯一可以实现的方法;更多.

而不是必须绑定您的类来执行位置角色,有一种特殊的语法使用是特质。所以不必写:

# Perl 6
my @a := YourClass.new( 1,2,3 );

你可以写:

# Perl 6
my @a is YourClass = 1,2,3;

在Perl 5中,绑定数组比“普通”数组慢得多。在Perl 6中,数组在启动时同样。幸运的是,rakudo perl 6通过内联和“在定时”(Jiting)优化热代码路径。操作码在可能的情况下使用机器代码。(由于优化器的进步,这种情况发生得更快、更频繁、更好)。

%(Hash vs. Associative)

Perl 6中的散列实现类似于数组;您还可以将它们视为绑定散列(使用Perl 5术语)。而不是位置用于实现数组的角色,则结合性角色应用于实现散?#23567;?/p>

同样,一个简单的例子可能会有所帮助。关键方法是实现结合性角色。每当需要访问特定键的值时,都会调用此方法。所以,当你写:

say %h<foo>

你正在执行:

say %h.AT-KEY("foo")

?#27604;唬?#26377;许多其他方法 你可以实现。

&(Subroutine vs. Callable)

在Perl 5中,只有一种可调用的可执行代码,即子程序:

# Perl 5
sub frobnicate { shift ** 2 }

而且,如果要将子例程作为参数传递,则需要获得对它的引用:

# Perl 5
sub do_stuff_with {
 my $lambda = shift;
 &$lambda(shift);
}
say do_stuff_with( \&frobnicate, 42 ); # 1764

在Perl 6中,多种类型的对象可以包含可执行代码。他们的共同点是他们消耗了可赎回角色.

Sgil强制绑定到执行可赎回角色,就像%信号与结合性角色和@信号与位置角色。一个与Perl 5非常接近的例子是:

# Perl 6
my &foo = sub ($a,$b) { $a + $b }
say foo(42,666); # 708

注意,即使变量具有&Sigil,你知道不需要使用它来执行该变量中的代码。?#23548;?#19978;,如果您在开始与普通的人相比,没有什么区别分声明:

# Perl 6
BEGIN my &foo = sub ($a,$b) { $a + $b } # same as sub foo()

与Perl 5不同的是,在Perl 6中,开始块可以是没有块的单个语句,因此它与外部共享其词法范围。但我们将在以后的文章中更多地讨论这个问题。

使用&变量是在编译时知道某物可执行文件,即使某物还不知道。

还有其他方法可以设置一段代码以供执行:

# Perl 6
my &boo = -> $a, $b { $a + $b } # same, using a Block with a signature
my &goo = { $^a + $^b }   # same, using auto-generated signature
my &woo = * + *;     # same, using Whatever currying

还可以使用&在签名内签名以表示被调用者希望在那里执行什么东西。这使我们回到本节中的前两个代码示例:

# Perl 5
sub frobnicate { shift ** 2 }
sub do_stuff_with {
 my $lambda = shift;
 &$lambda(shift);
}
say do_stuff_with( \&frobnicate, 42 ); # 1764
# Perl 6
sub frobnicate { $^a ** 2 }
sub do-stuff-with(&lambda, $param) { lambda($param) }
say do-stuff-with( &frobnicate, 42 ); # 1764

注意,在Perl 6中,您不需要接受引用;您可以简单地传递代码对象如&作为参数。

$(Scalar vs. Item)

与@、%和&Sigils相比,$sigil有点平淡。它不强制执行任何类型检查,因此可以将其绑定到任何类型的对象。因此,当你写:

# Perl 6
my $answer = 42;

像这样的事情发生了:

# Perl 6
my $answer := Scalar.new(42);

除了在一个很低的水平。因此,如果您想知道,此代码将无法工作。当你声明标量变量时,就是这样。

在Perl 6中,$还?#36171;觶?#20854;中的任何内容都应被视为单一的项目。因此,即使标量容器中填充了列阵对象时,在需要迭代的情况下,它将被视为单个项:

# Perl 6
my @foo = 1,2,3;
my $bar = Array.new(1,2,3); # alternately: [1,2,3]
.say for @foo; # 1␤2␤3␤
.say for $bar; # [1 2 3]

请注意,后一种情况只适用于一迭代VS三在前一种情况下。您可以通过前缀?#23454;?#30340;sigil来指示是否要迭代某些内容:

# Perl 6
.say for [email protected]; # [1 2 3] , consider the array as an item
.say for @$bar; # 1␤2␤3␤ , consider the scalar as a list

但也许这会把我们带到噪音太远的地方。幸运的是,还有更详细的等价物:

# Perl 6
.say for @foo.item; # [1 2 3] , consider the array as an item
.say for $bar.list; # 1␤2␤3␤ , consider the scalar as a list

* (Typeglobs)

正如您可能已经注意到的,Perl 6没有*sigil或type globs的概念。如果你不知道是什么类型的球体,你不必担心这个。您可以很好地度过难关,而不必知道Perl 5中复杂的符号表(也可以跳过下一段)。

    在Perl 6中,Sigil是存储在符号表中的名称的一部分,而在Perl 5中,名称是在没有信号的情况下存储的。例如,在Perl 5中,如果在程序中引用$foo,编译器将查找foo(没有sigil),然后获取相关信息(这是一个数组),并查找它所需的$sigil索引。在Perl 6中,如果引用$foo,编译器将查找$foo并直接使用与该键相关的信息。

请不要混淆用于表示Perl 6中的参数与Perl 5中的Type Gulb SIGL的SLurpy,它们彼此没有任何关系。

Sigilless variables

Perl 5不支持无符号变量(除了可能的左值子程序,但这确实非常笨拙)。

Perl 6也不直接支持Sigilless变量,但它支持通过前缀反?#22791;?\)定义中的名称:

# Perl 6
my \the-answer = 42;
say the-answer; # 42

由于赋值的右边是常量,这与定义常量基本相同:

# Perl 5
use constant the_answer => 42;
say the_answer; # 42
# Perl 6
my constant the-answer = 42;
say the-answer; # 42

如果定义的右边是别的东西,那就更有趣了。就像一个容器!这允许使用以下语法来获得无符号变量:

# Perl 6
my \foo = $ = 41;    # a sigilless scalar variable
my \bar = @ = 1,2,3,4,5;   # a sigilless array
my \baz = % = a => 42, b => 666; # a sigilless hash

这基本上是创建匿名词法实体(标量、数组和哈希),使用正常语义初始化它们,然后绑定生成的对象(标?#32771;?#35013;箱列阵对象,以?#21543;?#21015;对象)的名称,您可以将其用作Perl 6中的任何其他普通变量。

# Perl 6
say ++foo;  # 42
say bar[2]; # 3
bar[2] = 42;
say bar[2]; # 42
say baz<a b>; # (42 666)

?#27604;唬?#36825;样做,您将失去所有的优势,特别是在插值方面。然后,您将始终需要使用{ }在插值?#23567;?/p>

# Perl 6
say "The answer is {the-answer}."; # The answer is 42.

在Perl 5的大多数版本中,对应的内容更麻?#24120;?/p>

# Perl 5
say "The answer is @{[the_answer]}."; # The answer is 42.

当使用Perl 5概念考虑这些变量时,Perl 6中的所有变量都可以被视为绑定变量。这使得他们在一开始就有点慢。但是在某些基准测试中,运行时优化和热代码路径的JITting(从一点到机器代码)已经使其速度超过Perl 5变量。

@, %,和&在Perl 6中,不要创建任何特定的对象,而是指示一个类型约束,该约束将应用于名称绑定到的对象。$Sigil在这方面是不同的,因为没有要强制执行的类型约束。

@和$前缀分别表示实值化和项化,尽管使用.清单和.项目方法代替。

通过几个语法,可以不用变量名称中的任何Sigl来编程Perl 6。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对爱安网的支持。如果你想了解更多相关内容请查看下面相关链接

    无相关信息
最新资讯

口碑饿了么:“三个100

阿里巴巴2019年全球投资者大会上,口碑饿了么透露,年初启
贾?#23601;?#26132;日伙伴韬蕴资本代持“罗生门”

贾?#23601;?#26132;日伙伴韬蕴资

是韬蕴资本挪用了?#24335;穡?#20266;造了公章?曾经系供销大集第三大
小米再?#28982;?#36141;1074万股股份 耗?#24335;?亿港元

小米再?#28982;?#36141;1074万股

小米集团日前对外发布公告称,9月23日再?#20301;?#36141;1074万股,
康泰纳仕中国声明?#20309;?#21457;现?#24179;?#26377;任何违规行为

康泰纳仕中国声明?#20309;?#21457;

针对收到“康泰纳仕普通的员工”的匿名邮件这一事件,康
品钛上半年净利润1.032亿元 同比增长218%

品钛上半年净利润1.03

中国金融科技解决方案提供?#21776;?#38043;今日发布了截至6月30
最新文章
将Perl5代码迁移到Perl6上的解决方案

将Perl5代码迁移到Per

今天小编就为大家分享一篇关于将Perl5代码迁移到Perl6
Perl 批量添加Copyright版权信息

Perl 批量添加Copyrig

对所有输入文件,如果没有版权信息则加上版权信息,否则什
Perl字符串处理函数大全

Perl字符串处理函数大

本文重点讨论Perl字符串处理函数的用法,每种函数都有
Perl中常见符号与操作

Perl中常见符号与操作

这篇文章主要介绍了Perl中常见符号与操作,需要的朋友
Perl学习教程之单行命令详解

Perl学习教程之单行命

这篇文章主要给大家介绍了关于Perl学习教程之单行命令
使用Perl生成随机密码

使用Perl生成随机密码

本文给大家分享的是使用perl生成随机密码的方法示例,而
幸运蛋蛋pc开奖 双色球机选爱彩网 高频彩彩票计划推荐网 四川时时彩合法的吗 透宣app 合乐888登录页面 保定麻将技巧网站 大乐透开专家推荐号 三d一定牛 网上电游赌博 快速时时彩正规吗