人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動(dòng)態(tài)

Perl5和Perl6對(duì)比使用Sigils的差別

發(fā)布日期:2021-12-29 00:02 | 文章來(lái)源:gibhub

我們將看到Sigls(變量名稱(chēng)開(kāi)頭處的符號(hào))Perl 5和Perl 6之間的差別。

概述

讓我們從Perl 5和Perl 6中的Sigils概述開(kāi)始:

符號(hào) Perl5 Perl6
@ Array Positional
% Hash Associative
& Subroutine Callable
$ Scalar Item
* Typeglob N/a

@(Array vs. Positional)

在perl 5中定義數(shù)組時(shí),可以創(chuàng)建一個(gè)可擴(kuò)展的標(biāo)量值列表,并給它一個(gè)帶有sigil的名稱(chēng)。@:

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

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

# 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 );

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

# Perl 6
say Array ~~ Positional; # True

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

say @a[42]

你正在執(zhí)行:

say @a.AT-POS(42)

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

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

# Perl 6
my @a := YourClass.new( 1,2,3 );

你可以寫(xiě):

# Perl 6
my @a is YourClass = 1,2,3;

在Perl 5中,綁定數(shù)組比“普通”數(shù)組慢得多。在Perl 6中,數(shù)組在啟動(dòng)時(shí)同樣緩慢。幸運(yùn)的是,rakudo perl 6通過(guò)內(nèi)聯(lián)和“在定時(shí)”(Jiting)優(yōu)化熱代碼路徑。操作碼在可能的情況下使用機(jī)器代碼。(由于優(yōu)化器的進(jìn)步,這種情況發(fā)生得更快、更頻繁、更好)。

%(Hash vs. Associative)

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

同樣,一個(gè)簡(jiǎn)單的例子可能會(huì)有所幫助。關(guān)鍵方法是實(shí)現(xiàn)結(jié)合性角色。每當(dāng)需要訪問(wèn)特定鍵的值時(shí),都會(huì)調(diào)用此方法。所以,當(dāng)你寫(xiě):

say %h<foo>

你正在執(zhí)行:

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

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

&(Subroutine vs. Callable)

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

# Perl 5
sub frobnicate { shift ** 2 }

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

# Perl 5
sub do_stuff_with {
 my $lambda = shift;
 &$lambda(shift);
}
say do_stuff_with( \&frobnicate, 42 ); # 1764

在Perl 6中,多種類(lèi)型的對(duì)象可以包含可執(zhí)行代碼。他們的共同點(diǎn)是他們消耗了可贖回角色.

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

# Perl 6
my &foo = sub ($a,$b) { $a + $b }
say foo(42,666); # 708

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

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

與Perl 5不同的是,在Perl 6中,開(kāi)始?jí)K可以是沒(méi)有塊的單個(gè)語(yǔ)句,因此它與外部共享其詞法范圍。但我們將在以后的文章中更多地討論這個(gè)問(wèn)題。

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

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

# 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

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

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

$(Scalar vs. Item)

與@、%和&Sigils相比,$sigil有點(diǎn)平淡。它不強(qiáng)制執(zhí)行任何類(lèi)型檢查,因此可以將其綁定到任何類(lèi)型的對(duì)象。因此,當(dāng)你寫(xiě):

# Perl 6
my $answer = 42;

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

# Perl 6
my $answer := Scalar.new(42);

除了在一個(gè)很低的水平。因此,如果您想知道,此代碼將無(wú)法工作。當(dāng)你聲明標(biāo)量變量時(shí),就是這樣。

在Perl 6中,$還指出,其中的任何內(nèi)容都應(yīng)被視為單一的項(xiàng)目。因此,即使標(biāo)量容器中填充了列陣對(duì)象時(shí),在需要迭代的情況下,它將被視為單個(gè)項(xiàng):

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

請(qǐng)注意,后一種情況只適用于一迭代VS三在前一種情況下。您可以通過(guò)前綴適當(dāng)?shù)膕igil來(lái)指示是否要迭代某些內(nèi)容:

# 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

但也許這會(huì)把我們帶到噪音太遠(yuǎn)的地方。幸運(yùn)的是,還有更詳細(xì)的等價(jià)物:

# 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沒(méi)有*sigil或type globs的概念。如果你不知道是什么類(lèi)型的球體,你不必?fù)?dān)心這個(gè)。您可以很好地度過(guò)難關(guān),而不必知道Perl 5中復(fù)雜的符號(hào)表(也可以跳過(guò)下一段)。

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

請(qǐng)不要混淆用于表示Perl 6中的參數(shù)與Perl 5中的Type Gulb SIGL的SLurpy,它們彼此沒(méi)有任何關(guān)系。

Sigilless variables

Perl 5不支持無(wú)符號(hào)變量(除了可能的左值子程序,但這確實(shí)非常笨拙)。

Perl 6也不直接支持Sigilless變量,但它支持通過(guò)前綴反斜杠(\)定義中的名稱(chēng):

# 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

如果定義的右邊是別的東西,那就更有趣了。就像一個(gè)容器!這允許使用以下語(yǔ)法技巧來(lái)獲得無(wú)符號(hào)變量:

# 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í)體(標(biāo)量、數(shù)組和哈希),使用正常語(yǔ)義初始化它們,然后綁定生成的對(duì)象(標(biāo)量集裝箱列陣對(duì)象,以及散列對(duì)象)的名稱(chēng),您可以將其用作Perl 6中的任何其他普通變量。

# Perl 6
say ++foo;  # 42
say bar[2]; # 3
bar[2] = 42;
say bar[2]; # 42
say baz<a b>; # (42 666)

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

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

在Perl 5的大多數(shù)版本中,對(duì)應(yīng)的內(nèi)容更麻煩:

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

當(dāng)使用Perl 5概念考慮這些變量時(shí),Perl 6中的所有變量都可以被視為綁定變量。這使得他們?cè)谝婚_(kāi)始就有點(diǎn)慢。但是在某些基準(zhǔn)測(cè)試中,運(yùn)行時(shí)優(yōu)化和熱代碼路徑的JITting(從一點(diǎn)到機(jī)器代碼)已經(jīng)使其速度超過(guò)Perl 5變量。

@, %,和&在Perl 6中,不要?jiǎng)?chuàng)建任何特定的對(duì)象,而是指示一個(gè)類(lèi)型約束,該約束將應(yīng)用于名稱(chēng)綁定到的對(duì)象。$Sigil在這方面是不同的,因?yàn)闆](méi)有要強(qiáng)制執(zhí)行的類(lèi)型約束。

@和$前綴分別表示實(shí)值化和項(xiàng)化,盡管使用.清單和.項(xiàng)目方法代替。

通過(guò)幾個(gè)語(yǔ)法技巧,可以不用變量名稱(chēng)中的任何Sigl來(lái)編程Perl 6。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)本站的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接

版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實(shí)時(shí)開(kāi)通

自選配置、實(shí)時(shí)開(kāi)通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專(zhuān)屬顧問(wèn)服務(wù)

1對(duì)1客戶咨詢顧問(wèn)

在線
客服

在線客服:7*24小時(shí)在線

客服
熱線

400-630-3752
7*24小時(shí)客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部