時間:2020-02-13來源:系統城作者:電腦系統城
我們將看到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 6中定義數組時,將創建一個新的列陣對象和綁定它以詞法墊中的那個名字輸入條目。因此:
在功能上與Perl 5中相同。然而,第一行是用于:
這將綁定(而不是賦值)一個新的列陣對象指向詞匯定義的名稱。@foo。這,這個,那,那個@perl 6中的sigil表示一個類型約束:如果您想用該sigil將某個東西綁定到lexpad條目中,則它必執行位置角色。要確定一個類是否使用SmartMatch執行某個角色并不困難:
您可以認為perl 6中的所有數組都是以與綁定陣列在Perl 5中實現。而這也離事實不遠。如果不深入細節,一個簡單的例子可能會澄清這一點。這,這個,那,那個at-POS方法是實現位置角色。每當需要訪問單個元素時,都會調用此方法。所以,當你寫:
say @a[42]
你正在執行:
say @a.AT-POS(42)
當然,這不是唯一可以實現的方法;更多.
而不是必須綁定您的類來執行位置角色,有一種特殊的語法使用是特質。所以不必寫:
你可以寫:
在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 6中,多種類型的對象可以包含可執行代碼。他們的共同點是他們消耗了可贖回角色.
Sgil強制綁定到執行可贖回角色,就像%信號與結合性角色和@信號與位置角色。一個與Perl 5非常接近的例子是:
注意,即使變量具有&Sigil,你知道不需要使用它來執行該變量中的代碼。實際上,如果您在開始與普通的人相比,沒有什么區別分聲明:
與Perl 5不同的是,在Perl 6中,開始塊可以是沒有塊的單個語句,因此它與外部共享其詞法范圍。但我們將在以后的文章中更多地討論這個問題。
使用&變量是在編譯時知道某物可執行文件,即使某物還不知道。
還有其他方法可以設置一段代碼以供執行:
還可以使用&在簽名內簽名以表示被調用者希望在那里執行什么東西。這使我們回到本節中的前兩個代碼示例:
注意,在Perl 6中,您不需要接受引用;您可以簡單地傳遞代碼對象如&作為參數。
$(Scalar vs. Item)
與@、%和&Sigils相比,$sigil有點平淡。它不強制執行任何類型檢查,因此可以將其綁定到任何類型的對象。因此,當你寫:
像這樣的事情發生了:
除了在一個很低的水平。因此,如果您想知道,此代碼將無法工作。當你聲明標量變量時,就是這樣。
在Perl 6中,$還指出,其中的任何內容都應被視為單一的項目。因此,即使標量容器中填充了列陣對象時,在需要迭代的情況下,它將被視為單個項:
請注意,后一種情況只適用于一迭代VS三在前一種情況下。您可以通過前綴適當的sigil來指示是否要迭代某些內容:
但也許這會把我們帶到噪音太遠的地方。幸運的是,還有更詳細的等價物:
* (Typeglobs)
正如您可能已經注意到的,Perl 6沒有*sigil或type globs的概念。如果你不知道是什么類型的球體,你不必擔心這個。您可以很好地度過難關,而不必知道Perl 5中復雜的符號表(也可以跳過下一段)。
請不要混淆用于表示Perl 6中的參數與Perl 5中的Type Gulb SIGL的SLurpy,它們彼此沒有任何關系。
Sigilless variables
Perl 5不支持無符號變量(除了可能的左值子程序,但這確實非常笨拙)。
Perl 6也不直接支持Sigilless變量,但它支持通過前綴反斜杠(\)定義中的名稱:
由于賦值的右邊是常量,這與定義常量基本相同:
如果定義的右邊是別的東西,那就更有趣了。就像一個容器!這允許使用以下語法技巧來獲得無符號變量:
這基本上是創建匿名詞法實體(標量、數組和哈希),使用正常語義初始化它們,然后綁定生成的對象(標量集裝箱列陣對象,以及散列對象)的名稱,您可以將其用作Perl 6中的任何其他普通變量。
當然,這樣做,您將失去所有的優勢,特別是在插值方面。然后,您將始終需要使用{ }在插值中。
在Perl 5的大多數版本中,對應的內容更麻煩:
當使用Perl 5概念考慮這些變量時,Perl 6中的所有變量都可以被視為綁定變量。這使得他們在一開始就有點慢。但是在某些基準測試中,運行時優化和熱代碼路徑的JITting(從一點到機器代碼)已經使其速度超過Perl 5變量。
@, %,和&在Perl 6中,不要創建任何特定的對象,而是指示一個類型約束,該約束將應用于名稱綁定到的對象。$Sigil在這方面是不同的,因為沒有要強制執行的類型約束。
@和$前綴分別表示實值化和項化,盡管使用.清單和.項目方法代替。
通過幾個語法技巧,可以不用變量名稱中的任何Sigl來編程Perl 6。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對我們的支持。如果你想了解更多相關內容請查看下面相關鏈接
2020-02-13
Linux下用Nginx作Perl程序服務器及其中Perl模塊的配置2020-02-13
Perl學習教程之單行命令詳解2020-02-13
將Perl5代碼遷移到Perl6上的解決方案這篇文章主要給大家介紹了如何通過一篇文章搞懂:詞法作用域、動態作用域、回調函數及閉包的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值...
2020-02-13
目錄Windows10下hyperledger fabric1.4環境搭建PrerequisitesWindows10專業版Git bashcURLGO Progamming LanguageDocker and Docker-composeInstall Samples, Binaries and Docker Imagesshared drivers執行 Window...
2020-02-13