我们将看到Sigls(变量名称开头处的符号)Perl 5和Perl 6之间的差别。
概述
让我们从Perl 5和Perl 6中的Sigils概述开始:
符号 Perl5 Perl6 @ Array Positional % Hash Associative & Subroutine Callable $ Scalar Item * Typeglob N/a@(Array vs. Positional)
在perl 5中定义数组时,可以创建一个可扩展的标量值列表,并给它一个带有sigil的名称。@:
# Perl 5 my @foo = (1,2,3); push @foo, 42; say for @foo; # 1"htmlcode"># Perl 6 my @foo = 1,2,3; push @foo, 42; .say for @foo; # 1"htmlcode"># 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方法是实现位置角色。每当需要访问单个元素时,都会调用此方法。所以,当你写:
say @a[42]
你正在执行:
say @a.AT-POS(42)
当然,这不是唯一可以实现的方法;更多.
而不是必须绑定您的类来执行位置角色,有一种特殊的语法使用是特质。所以不必写:
# 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术语)。而不是位置用于实现数组的角色,则结合性角色应用于实现散列。
同样,一个简单的例子可能会有所帮助。关键方法是实现结合性角色。每当需要访问特定键的值时,都会调用此方法。所以,当你写:
say %h<foo>
你正在执行:
say %h.AT-KEY("foo")
当然,有许多其他方法 你可以实现。
&(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,你知道不需要使用它来执行该变量中的代码。实际上,如果您在开始与普通的人相比,没有什么区别分声明:
# 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中,$还指出,其中的任何内容都应被视为单一的项目。因此,即使标量容器中填充了列阵对象时,在需要迭代的情况下,它将被视为单个项:
# Perl 6 my @foo = 1,2,3; my $bar = Array.new(1,2,3); # alternately: [1,2,3] .say for @foo; # 1"htmlcode"># Perl 6 .say for $@foo; # [1 2 3] , consider the array as an item .say for @$bar; # 1"htmlcode"># Perl 6 .say for @foo.item; # [1 2 3] , consider the array as an item .say for $bar.list; # 1"htmlcode"># 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这基本上是创建匿名词法实体(标量、数组和哈希),使用正常语义初始化它们,然后绑定生成的对象(标量集装箱列阵对象,以及散列对象)的名称,您可以将其用作Perl 6中的任何其他普通变量。
# Perl 6 say ++foo; # 42 say bar[2]; # 3 bar[2] = 42; say bar[2]; # 42 say baz<a b>; # (42 666)当然,这样做,您将失去所有的优势,特别是在插值方面。然后,您将始终需要使用{ }在插值中。
# Perl 6 say "The answer is {the-answer}."; # The answer is 42.在Perl 5的大多数版本中,对应的内容更麻烦:
# 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。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。如果你想了解更多相关内容请查看下面相关链接
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com暂无“Perl5和Perl6对比使用Sigils的差别”评论...
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新动态
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]