- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Perl5和Perl6对比使用Sigils的差别由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
我们将看到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的名称。@
1
2
3
4
|
# Perl 5
my
@foo
= (1,2,3);
push
@foo
, 42;
say
for
@foo
;
# 12342
|
在perl 6中定义数组时,将创建一个新的列阵对象和绑定它以词法垫中的那个名字输入条目。因此:
1
2
3
4
|
# Perl 6
my
@foo
= 1,2,3;
push
@foo
, 42;
.say
for
@foo
;
# 12342
|
在功能上与Perl 5中相同。然而,第一行是用于:
1
2
|
# Perl 6
my
@foo
:= Array.new( 1,2,3 );<br>
|
这将绑定(而不是赋值)一个新的列阵对象指向词汇定义的名称。@foo。这,这个,那,那个@perl 6中的sigil表示一个类型约束:如果您想用该sigil将某个东西绑定到lexpad条目中,则它必执行位置角色。要确定一个类是否使用SmartMatch执行某个角色并不困难:
1
2
|
# Perl 6
say Array ~~ Positional;
# True
|
您可以认为perl 6中的所有数组都是以与绑定阵列在Perl 5中实现。而这也离事实不远。如果不深入细节,一个简单的例子可能会澄清这一点。这,这个,那,那个at-POS方法是实现位置角色。每当需要访问单个元素时,都会调用此方法。所以,当你写:
say @a[42] 。
你正在执行:
say @a.AT-POS(42) 。
当然,这不是唯一可以实现的方法;更多. 。
而不是必须绑定您的类来执行位置角色,有一种特殊的语法使用是特质。所以不必写:
1
2
|
# Perl 6
my
@a
:= YourClass.new( 1,2,3 );<br>
|
你可以写:
1
2
|
# 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中,只有一种可调用的可执行代码,即子程序:
1
2
|
# Perl 5
sub
frobnicate {
shift
** 2 }<br>
|
而且,如果要将子例程作为参数传递,则需要获得对它的引用:
1
2
3
4
5
6
|
# Perl 5
sub
do_stuff_with {
my
$lambda
=
shift
;
&
$lambda
(
shift
);
}
say do_stuff_with( \&frobnicate, 42 );
# 1764
|
在Perl 6中,多种类型的对象可以包含可执行代码。他们的共同点是他们消耗了可赎回角色. 。
Sgil强制绑定到执行可赎回角色,就像%信号与结合性角色和@信号与位置角色。一个与Perl 5非常接近的例子是:
1
2
3
|
# Perl 6
my
&foo =
sub
(
$a
,
$b
) {
$a
+
$b
}
say foo(42,666);
# 708<br>
|
注意,即使变量具有&Sigil,你知道不需要使用它来执行该变量中的代码。实际上,如果您在开始与普通的人相比,没有什么区别分声明:
1
2
|
# Perl 6
BEGIN
my
&foo =
sub
(
$a
,
$b
) {
$a
+
$b
}
# same as sub foo()
|
与Perl 5不同的是,在Perl 6中,开始块可以是没有块的单个语句,因此它与外部共享其词法范围。但我们将在以后的文章中更多地讨论这个问题.
使用&变量是在编译时知道某物可执行文件,即使某物还不知道.
还有其他方法可以设置一段代码以供执行:
1
2
3
4
|
# 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
|
还可以使用&在签名内签名以表示被调用者希望在那里执行什么东西。这使我们回到本节中的前两个代码示例:
1
2
3
4
5
6
7
|
# Perl 5
sub
frobnicate {
shift
** 2 }
sub
do_stuff_with {
my
$lambda
=
shift
;
&
$lambda
(
shift
);
}
say do_stuff_with( \&frobnicate, 42 );
# 1764<br>
|
1
2
3
4
|
# 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有点平淡。它不强制执行任何类型检查,因此可以将其绑定到任何类型的对象。因此,当你写:
1
2
|
# Perl 6
my
$answer
= 42;
|
像这样的事情发生了:
1
2
|
# Perl 6
my
$answer
:=
Scalar
.new(42);
|
除了在一个很低的水平。因此,如果您想知道,此代码将无法工作。当你声明标量变量时,就是这样.
在Perl 6中,$还指出,其中的任何内容都应被视为单一的项目。因此,即使标量容器中填充了列阵对象时,在需要迭代的情况下,它将被视为单个项:
1
2
3
4
5
|
# Perl 6
my
@foo
= 1,2,3;
my
$bar
= Array.new(1,2,3);
# alternately: [1,2,3]
.say
for
@foo
;
# 123
.say
for
$bar
;
# [1 2 3]
|
请注意,后一种情况只适用于一迭代VS三在前一种情况下。您可以通过前缀适当的sigil来指示是否要迭代某些内容:
1
2
3
|
# Perl 6
.say
for
$
@foo
;
# [1 2 3] , consider the array as an item
.say
for
@
$bar
;
# 123 , consider the scalar as a list
|
但也许这会把我们带到噪音太远的地方。幸运的是,还有更详细的等价物:
1
2
3
|
# Perl 6
.say
for
@foo
.item;
# [1 2 3] , consider the array as an item
.say
for
$bar
.list;
# 123 , consider the scalar as a list
|
* (Typeglobs) 。
正如您可能已经注意到的,Perl 6没有*sigil或type globs的概念。如果你不知道是什么类型的球体,你不必担心这个。您可以很好地度过难关,而不必知道Perl 5中复杂的符号表(也可以跳过下一段).
请不要混淆用于表示Perl 6中的参数与Perl 5中的Type Gulb SIGL的SLurpy,它们彼此没有任何关系.
Sigilless variables 。
Perl 5不支持无符号变量(除了可能的左值子程序,但这确实非常笨拙).
Perl 6也不直接支持Sigilless变量,但它支持通过前缀反斜杠(\)定义中的名称:
1
2
3
|
# Perl 6
my
\the-answer = 42;
say the-answer;
# 42
|
由于赋值的右边是常量,这与定义常量基本相同:
1
2
3
4
5
6
|
# Perl 5
use
constant the_answer => 42;
say the_answer;
# 42
# Perl 6
my
constant the-answer = 42;
say the-answer;
# 42
|
如果定义的右边是别的东西,那就更有趣了。就像一个容器!这允许使用以下语法技巧来获得无符号变量:
1
2
3
4
|
# 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中的任何其他普通变量.
1
2
3
4
5
6
|
# Perl 6
say ++foo;
# 42
say bar[2];
# 3
bar[2] = 42;
say bar[2];
# 42
say baz<a b>;
# (42 666)
|
当然,这样做,您将失去所有的优势,特别是在插值方面。然后,您将始终需要使用{ }在插值中.
1
2
|
# Perl 6
say
"The answer is {the-answer}."
;
# The answer is 42.
|
在Perl 5的大多数版本中,对应的内容更麻烦:
1
2
|
# 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.
总结 。
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我的支持。如果你想了解更多相关内容请查看下面相关链接 。
原文链接:https://opensource.com/article/18/9/using-sigils-perl-6 。
最后此篇关于Perl5和Perl6对比使用Sigils的差别的文章就讲到这里了,如果你想了解更多关于Perl5和Perl6对比使用Sigils的差别的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
如果我的 Perl 程序使用 Perl 模块,它将如何确定在哪里可以找到包含模块代码的文件? 例如,如果程序包含: use MyModule1; # Example 1 us
我在一个文件中有一些不同格式的数字:8.3、0.001、9e-18。我正在寻找一种简单的方法来读取它们并存储它们而不会损失任何精度。这在 AWK 中很容易,但在 Perl 中是如何完成的呢?我只愿意使
我在一个文件中有一些不同格式的数字:8.3、0.001、9e-18。我正在寻找一种简单的方法来读取它们并存储它们而不会损失任何精度。这在 AWK 中很容易,但在 Perl 中是如何完成的呢?我只愿意使
我正在自学 Perl,并且在我的 Windows 8 64 位系统上安装了 Strawberry。 Strawberry 命令行似乎工作正常,我在 C 驱动器上的 Strawberry 文件夹中创建了
我在 Perl 模块 IO::Socket::SSL 中发现了一个错误,我可能会修复它,但是,我担心测试修复。我从 Debian 下载了源码包(因为我打算为它制作一个 Debian 包或补丁)并查看了
我有一个 perl 文件,它使用了两个 perl 模块 A.pm 和 B.pm。 但是在 B.pm 中我需要调用 A.pm 的子程序。即使我在 A.pm 中使用并尝试使用它,我仍然遇到未定义的错误。
有没有办法在 Perl 运行时加载整个模块?我原以为我用 autouse 找到了一个很好的解决方案,但以下代码无法编译: package tryAutouse2; use autouse 'tryAu
过去,我编写过许多 perl 模块,以及不止一些独立的 perl 程序,但我之前从未发布过多文件 perl 程序。 我有一个几乎处于 beta 阶段的 perl 程序,它将被开源发布。它需要一些数据文
我有 1 个 perl 脚本,我们在其中编写了几个子例程。例子: # Try_1.pl main(); sub main{ --- --- check(); } check { -- --} 现在,
似乎 CPAN 上的一些(很多?)模块部分是使用 XS 在 C 中实现的,如果需要,可以回退到纯 perl 实现。虽然这很聪明,但它显然会损害性能,我想知道它是否会发生,以便我可以解决问题。 有没有一
我对 perl 很陌生。我希望我可以从 perl 安装一些软件包,我这样做是这样的: perl -MCPAN -e 'install VM::EC2' 我猜它由于依赖而失败,它显示: Result:
给定一个 Perl 包 Foo.pm,例如 package Foo; use strict; sub bar { # some code here } sub baz { # more
我有一个用 Perl 编写的测试生成器。它生成连接到模拟器的测试。这些测试本身是用 Perl 编写的,并通过其 API 连接到模拟器。我希望生成的代码是人类可读的,这意味着我希望它能够正确缩进和格式化
我正在学习 Perl,非常新的用户。我可以知道这些 Perl 代码之间有什么区别吗? #!/usr/bin/perl & #!/usr/bin/perl -w 最佳答案 那不是 perl 代码,它是
我不认为这是一个重复的问题。这专门针对 Perl 模块附带的脚本。 通常,在安装多个 Perl 版本时,您可以将 perl 可执行文件标记为版本号 (perl5.32),这样它们就可以在 /whate
我有一个在文件中使用 Blowfish 加密的程序和第二个 perl 程序,它提示输入用于将其解密为字符串的密码,我希望不必将解密的源代码写入硬盘驱动器,尽管将它放在内存中并不是真正的问题,因为运行程
有没有人为 Perl 中的惰性求值列表找到了一个好的解决方案?我尝试了很多方法来改变类似的东西 for my $item ( map { ... } @list ) { } 进入懒惰的评估——例如,通
我安装了多个版本的 Perl。 我已经指定了要使用的版本。但是为了验证,我想从 .pl 脚本本身输出 Perl 的版本。 这可能吗? 在 Perl 脚本中解析“perl --version”的输出似乎
人们还经常问“我怎样才能编译 Perl?”而他们真正想要的是创建一个可以在机器上运行的可执行文件,即使他们没有安装 Perl。 我知道有几种解决方案: perl2exe靛蓝之星 它是商业的。我从未尝试
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它. 8年前关闭。 Improve this
我是一名优秀的程序员,十分优秀!