幸运蛋蛋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方法是實現位置角色。每當需要訪問單個元素時,都會調用此方法。所以,當你寫:

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

請注意,后一種情況只適用于一迭代VS三在前一種情況下。您可以通過前綴適當的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變量,但它支持通過前綴反斜杠(\)定義中的名稱:

# 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。

總結

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

    無相關信息
最新資訊
中興通訊:本次非公開發行股票將于2020年2月3日上市

中興通訊:本次非公開

中興通訊發布公告稱,本次非公開發行股票將于2020年2月3
特斯拉市值超千億 馬斯克領取首份工資

特斯拉市值超千億 馬

特斯拉市值超過千億美元,也標志著特斯拉CEO馬斯克即將
華為開發者大會2020因疫情延期至3月:以直播呈現

華為開發者大會2020因

華為官方宣布,基于新型冠狀病毒感染的肺炎疫情防控形勢
韻達速遞:將對抵達武漢的快件和車輛進行消毒

韻達速遞:將對抵達武漢

韻達發布公告稱,將在武漢及寄達地處理中心對快件與車輛
餓了么:除了醫院及周邊,武漢其他區域照常配送

餓了么:除了醫院及周邊

餓了么發布公告稱,目前在武漢,除了醫院及周邊區域外,其他
京東:過去三天共售出口罩1.26億只

京東:過去三天共售出口

1月23日,京東發布消息,稱1月19日至22日期間,平臺口罩累計
最新文章
將Perl5代碼遷移到Perl6上的解決方案

將Perl5代碼遷移到Per

今天小編就為大家分享一篇關于將Perl5代碼遷移到Perl6
Perl 批量添加Copyright版權信息

Perl 批量添加Copyrig

對所有輸入文件,如果沒有版權信息則加上版權信息,否則什
Perl字符串處理函數大全

Perl字符串處理函數大

本文重點討論Perl字符串處理函數的用法,每種函數都有
Perl中常見符號與操作

Perl中常見符號與操作

這篇文章主要介紹了Perl中常見符號與操作,需要的朋友
Perl學習教程之單行命令詳解

Perl學習教程之單行命

這篇文章主要給大家介紹了關于Perl學習教程之單行命令
使用Perl生成隨機密碼

使用Perl生成隨機密碼

本文給大家分享的是使用perl生成隨機密碼的方法示例,而
幸运蛋蛋pc开奖 河南22选5最新开奘结果22选5结果 4场进球彩开奖历史 时时彩 地下城勇士城决战者怎么加点 广东快乐十分常规基本走势图 福彩组六六码最大遗漏 摩尔快乐飞艇 7星彩18085 体球网即时指数 舟山星空棋牌