一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - perl - Perl5和Perl6對比使用Sigils的差別

Perl5和Perl6對比使用Sigils的差別

2020-06-26 14:34Elizabeth Mattijsen perl

今天小編就為大家分享一篇關于Perl5和Perl6對比使用Sigils的差別,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧

我們將看到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中定義數(shù)組時,可以創(chuàng)建一個可擴展的標量值列表,并給它一個帶有sigil的名稱。@:

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

在perl 6中定義數(shù)組時,將創(chuàng)建一個新的列陣對象和綁定它以詞法墊中的那個名字輸入條目。因此:

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

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

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

這將綁定(而不是賦值)一個新的列陣對象指向詞匯定義的名稱。@foo。這,這個,那,那個@perl 6中的sigil表示一個類型約束:如果您想用該sigil將某個東西綁定到lexpad條目中,則它必執(zhí)行位置角色。要確定一個類是否使用SmartMatch執(zhí)行某個角色并不困難:

?
1
2
# Perl 6
say Array ~~ Positional; # True

您可以認為perl 6中的所有數(shù)組都是以與綁定陣列在Perl 5中實現(xiàn)。而這也離事實不遠。如果不深入細節(jié),一個簡單的例子可能會澄清這一點。這,這個,那,那個at-POS方法是實現(xiàn)位置角色。每當需要訪問單個元素時,都會調用此方法。所以,當你寫:

say @a[42]

你正在執(zhí)行:

say @a.AT-POS(42)

當然,這不是唯一可以實現(xiàn)的方法;更多.

而不是必須綁定您的類來執(zhí)行位置角色,有一種特殊的語法使用是特質。所以不必寫:

?
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中,綁定數(shù)組比“普通”數(shù)組慢得多。在Perl 6中,數(shù)組在啟動時同樣緩慢。幸運的是,rakudo perl 6通過內聯(lián)和“在定時”(Jiting)優(yōu)化熱代碼路徑。操作碼在可能的情況下使用機器代碼。(由于優(yōu)化器的進步,這種情況發(fā)生得更快、更頻繁、更好)。

%(Hash vs. Associative)

Perl 6中的散列實現(xiàn)類似于數(shù)組;您還可以將它們視為綁定散列(使用Perl 5術語)。而不是位置用于實現(xiàn)數(shù)組的角色,則結合性角色應用于實現(xiàn)散列。

同樣,一個簡單的例子可能會有所幫助。關鍵方法是實現(xiàn)結合性角色。每當需要訪問特定鍵的值時,都會調用此方法。所以,當你寫:

say %h<foo>

你正在執(zhí)行:

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

當然,有許多其他方法 你可以實現(xiàn)。

&(Subroutine vs. Callable)

在Perl 5中,只有一種可調用的可執(zhí)行代碼,即子程序:

?
1
2
# Perl 5
sub frobnicate { shift ** 2 }<br>

而且,如果要將子例程作為參數(shù)傳遞,則需要獲得對它的引用:

?
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中,多種類型的對象可以包含可執(zhí)行代碼。他們的共同點是他們消耗了可贖回角色.

Sgil強制綁定到執(zhí)行可贖回角色,就像%信號與結合性角色和@信號與位置角色。一個與Perl 5非常接近的例子是:

?
1
2
3
# Perl 6
my &foo = sub ($a,$b) { $a + $b }
say foo(42,666); # 708<br>

注意,即使變量具有&Sigil,你知道不需要使用它來執(zhí)行該變量中的代碼。實際上,如果您在開始與普通的人相比,沒有什么區(qū)別分聲明:

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

與Perl 5不同的是,在Perl 6中,開始塊可以是沒有塊的單個語句,因此它與外部共享其詞法范圍。但我們將在以后的文章中更多地討論這個問題。

使用&變量是在編譯時知道某物可執(zhí)行文件,即使某物還不知道。

還有其他方法可以設置一段代碼以供執(zhí)行:

?
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

還可以使用&在簽名內簽名以表示被調用者希望在那里執(zhí)行什么東西。這使我們回到本節(jié)中的前兩個代碼示例:

?
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中,您不需要接受引用;您可以簡單地傳遞代碼對象如&作為參數(shù)。

$(Scalar vs. Item)

與@、%和&Sigils相比,$sigil有點平淡。它不強制執(zhí)行任何類型檢查,因此可以將其綁定到任何類型的對象。因此,當你寫:

?
1
2
# Perl 6
my $answer = 42;

像這樣的事情發(fā)生了:

?
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; # 1?2?3?
.say for $bar; # [1 2 3]

請注意,后一種情況只適用于一迭代VS三在前一種情況下。您可以通過前綴適當?shù)膕igil來指示是否要迭代某些內容:

?
1
2
3
# Perl 6
.say for $@foo; # [1 2 3] , consider the array as an item
.say for @$bar; # 1?2?3? , 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; # 1?2?3? , consider the scalar as a list

* (Typeglobs)

正如您可能已經(jīng)注意到的,Perl 6沒有*sigil或type globs的概念。如果你不知道是什么類型的球體,你不必擔心這個。您可以很好地度過難關,而不必知道Perl 5中復雜的符號表(也可以跳過下一段)。

  • 在Perl 6中,Sigil是存儲在符號表中的名稱的一部分,而在Perl 5中,名稱是在沒有信號的情況下存儲的。例如,在Perl 5中,如果在程序中引用$foo,編譯器將查找foo(沒有sigil),然后獲取相關信息(這是一個數(shù)組),并查找它所需的$sigil索引。在Perl 6中,如果引用$foo,編譯器將查找$foo并直接使用與該鍵相關的信息。

請不要混淆用于表示Perl 6中的參數(shù)與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

這基本上是創(chuàng)建匿名詞法實體(標量、數(shù)組和哈希),使用正常語義初始化它們,然后綁定生成的對象(標量集裝箱列陣對象,以及散列對象)的名稱,您可以將其用作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)

當然,這樣做,您將失去所有的優(yōu)勢,特別是在插值方面。然后,您將始終需要使用{ }在插值中。

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

在Perl 5的大多數(shù)版本中,對應的內容更麻煩:

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

當使用Perl 5概念考慮這些變量時,Perl 6中的所有變量都可以被視為綁定變量。這使得他們在一開始就有點慢。但是在某些基準測試中,運行時優(yōu)化和熱代碼路徑的JITting(從一點到機器代碼)已經(jīng)使其速度超過Perl 5變量。

@, %,和&在Perl 6中,不要創(chuàng)建任何特定的對象,而是指示一個類型約束,該約束將應用于名稱綁定到的對象。$Sigil在這方面是不同的,因為沒有要強制執(zhí)行的類型約束。

@和$前綴分別表示實值化和項化,盡管使用.清單和.項目方法代替。

通過幾個語法技巧,可以不用變量名稱中的任何Sigl來編程Perl 6。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對服務器之家的支持。如果你想了解更多相關內容請查看下面相關鏈接

原文鏈接:https://opensource.com/article/18/9/using-sigils-perl-6

延伸 · 閱讀

精彩推薦
  • perlperl常見問題集合之二

    perl常見問題集合之二

    哪些平臺上有 Perl?要到哪里去找? Perl的標準發(fā)行版(由 perl 發(fā)展小組負責維護)僅以原始碼形式發(fā)行。您可在 http: //www.perl.com/CPAN/src/latest.tar.gz處取得。這個檔...

    腳本之家2102020-05-29
  • perlPerl的經(jīng)典用法分享

    Perl的經(jīng)典用法分享

    Perl的經(jīng)典用法分享,學習perl的朋友可以參考下 ...

    腳本之家6562020-06-06
  • perlperl命令行參數(shù)內建數(shù)組@ARGV淺析

    perl命令行參數(shù)內建數(shù)組@ARGV淺析

    這篇文章主要介紹了perl命令行參數(shù)內建數(shù)組@ARGV淺析,本文重點在于講解@ARGV的用法,并通過實例來說明,需要的朋友可以參考下 ...

    perl教程網(wǎng)6162020-06-18
  • perlPerl從文件中讀取字符串的兩種實現(xiàn)方法

    Perl從文件中讀取字符串的兩種實現(xiàn)方法

    有時候我們需要從文件中讀取字符串,這里簡單介紹下, 需要的朋友可以參考下 ...

    腳本之家6252020-06-08
  • perlperl pop push shift unshift實例介紹

    perl pop push shift unshift實例介紹

    perl的pop跟push操作數(shù)組的最右邊,shift跟unshift操作數(shù)組的最左邊 ...

    腳本之家4612020-06-10
  • perlPerl使用nginx FastCGI環(huán)境做WEB開發(fā)實例

    Perl使用nginx FastCGI環(huán)境做WEB開發(fā)實例

    這篇文章主要介紹了Perl使用nginx FastCGI環(huán)境做WEB開發(fā)實例,實現(xiàn)了路由系統(tǒng)和模板系統(tǒng),需要的朋友可以參考下...

    Perl教程網(wǎng)2412020-06-18
  • perlPerl List::Util模塊使用實例

    Perl List::Util模塊使用實例

    這篇文章主要介紹了Perl List::Util模塊使用實例,本文給出掃描符合條件的某個列表并取出第一個符合條件的、求1到1000之間的和 、求一組數(shù)字的最大值與最小...

    腳本之家4712020-06-22
  • perlperl use vars pragma使用技巧

    perl use vars pragma使用技巧

    perl 中的vars是perl中的一個pragma(預編譯指示符),專門用來預定義全局變量,這些預定義后的全局變量在qw()列表中,在整個引用perl文件中皆可使用,即便使...

    perl教程網(wǎng)6812020-06-16
主站蜘蛛池模板: 5x社区在线观看直接进入 | 国产高清好大好夹受不了了 | h肉动漫在线视频无修无遮挡 | 国产在视频 | 千金奴隶在线 | 国产精品www视频免费看 | 成年男人永久免费看片 | 日韩性公交车上xxhd免费 | 日韩精品视频美在线精品视频 | 国产日韩高清一区二区三区 | 国产成人精品午夜在线播放 | 亚洲色图中文字幕 | 国产91精选在线观看麻豆 | 欧美日韩一区二区综合 | 2021最新国产成人精品免费 | 欧美灰丝袜丝交nylons | 欧美精品一区二区三区免费播放 | 免费抽搐一进一出印度 | 亚瑟天堂久久一区二区影院 | 美女无内裤下部黄 | 人生路不在线观看完整版 | 包射屋 | 香蕉视频在线观看网站 | 亚洲国产美女精品久久久久 | 四虎影院免费在线 | 亚洲精品国产自在现线最新 | v视界影院.vsjla | 欧美日韩在线成人看片a | 99精品久久99久久久久久 | 亚洲黄色三级视频 | 我强进了老师身体在线观看 | 国产精品嫩草影院一二三区 | 99久久精品在免费线18 | 耽美双性 | 国产精品久久久久久久久久久搜索 | 成人免费在线视频观看 | 日本在线观看免费观看完整版 | 小早川怜子息梦精在线播放 | 特黄特黄aaaa级毛片免费看 | 亚洲国产精品牛在线 | 成年人免费观看的视频 |