Perl 6 中列表趟章、序列和數(shù)組

列表一直是計(jì)算機(jī)的核心部分,因?yàn)橹坝杏?jì)算機(jī),在這段時(shí)間里确丢,許多惡魔占據(jù)了他們的細(xì)節(jié)褂始。 它們實(shí)際上是 Perl 6 設(shè)計(jì)中最難的部分之一崎苗,但是通過堅(jiān)持和耐心,Perl 6 已經(jīng)使用了一個(gè)優(yōu)雅的系統(tǒng)來處理它們幅慌。

Literal Lists

字面上的列表用逗號(hào)和分號(hào)不是用圓括號(hào)創(chuàng)建,因此:

1, 2        # This is two-element list
(1, 2)      # This is also a List, in parentheses
(1; 2)      # same List
(1)         # This is not a List, just a 1 in parentheses
(1,)        # This is a one-element List

括號(hào)可用于標(biāo)記列表的開頭和結(jié)尾骂租,因此:

(1, 2), (1, 2) # This is a list of two lists.

多維字面上的列表是通過逗號(hào)和分號(hào)組合而成的。 它們可以在常規(guī)參數(shù)列表和下標(biāo)中使用互站。

say so (1,2; 3,4) eqv ((1,2), (3,4));
# OUTPUT?True
?
say('foo';); # a list with one element and the empty list
# OUTPUT?(foo)()
?

單個(gè)元素可以使用下標(biāo)從列表中拉出磕潮。 列表的第一個(gè)元素的索引號(hào)為零:

say (1, 2)[0];   # says 1
say (1, 2)[1];   # says 2
say (1, 2)[2];   # says Nil
say (1, 2)[-1];  # Error
say (1, 2)[*-1]; # 2

The @ sigil

Perl 6 中名稱為 @ 符號(hào)的變量應(yīng)該包含某種類似列表的對象之景。 當(dāng)然,其他變量也可能包含這些對象脚囊,但是 @-sigiled 變量總是這樣我擂,并且期望它們作用于該部分校摩。

默認(rèn)情況下,當(dāng)您將列表分配給 @-sigiled 變量時(shí),您將創(chuàng)建一個(gè)數(shù)組摹芙。 這些在下面描述浮禾。 如果你想把一個(gè)真實(shí)的的 List 放到一個(gè) @ -sigiled 變量中杯活,你可以用 := 綁定代替。

my @a := 1, 2, 3;

將列表的列表賦值給 @-sigiled 變量不提供相同的快捷方式晤锹。 在這種情況下,外部 List 成為數(shù)組的第一個(gè)元素封断。

my @a = (1,2; 3,4);
say @a.flat;
# OUTPUT?((1 2) (3 4))
?
@a := (1,2; 3,4);
say @a.flat;
# OUTPUT?((1 2 3 4)
?

@_sigiled 變量像列表一樣的方式之一是總是支持位置下標(biāo)坡疼。 任何綁定到 @-sigiled 值的東西都必須支持 Positional 角色,這保證了:

my @a := 1;  # Type check failed in binding; expected Positional but got Int

# 但是
my @a := 1,; # (1)

Reset a List Container

要從 Positional 容器中刪除所有元素衣陶,請將 Empty柄瑰,空列表 () 或空列表的 Slip 賦值給容器。

my @a = 1, 2, 3;
@a = ();
@a = Empty;
@a = |();

Iteration

所有的列表都可以被迭代剪况,這意味著從列表中按順序拿出每個(gè)元素并在最后一個(gè)元素之后停止:

for 1, 2, 3 { .say } # says 1, then says 2, then says 3

Testing for Elements

要測試元素將 ListArray 轉(zhuǎn)換為 Set 或使用 Set 運(yùn)算符教沾。

my @a = <foo bar buzz>;
say @a.Set<bar buzz>; # (True True)
say so 'bar' ∈ @a;   # True

Sequences

不是所有的列表生來都充滿元素。 有些只創(chuàng)建他們被要求的盡可能多的元素该贾。 這些稱為序列,其類型為 Seq。 因?yàn)檫@樣發(fā)生蕊唐,循環(huán)返回 Seqs

(loop { 42.say })[2] # says 42 three times

所以滞谢,在 Perl 6 中有無限列表是很好的,只要你從不問他們所有的元素盔夜。 在某些情況下洞坑,你可能希望避免詢問它們有多長 - 如果 Perl 6 知道一個(gè)序列是無限的攻泼,它將嘗試返回 Inf隔盛,但它不能總是知道鳄炉。

雖然 Seq 類確實(shí)提供了一些位置下標(biāo)榕订,但它不提供 Positional 的完整接口,因此 @-sigiled 變量可能不會(huì)綁定到 Seq

my @s := (loop { 42.say }); # Error expected Positional but got Seq

這是因?yàn)?Seq 在使用它們之后不會(huì)保留值陈醒。 這是有用的行為,如果你有一個(gè)很長的序列领跛,因?yàn)槟憧赡芟朐谑褂盟鼈冎髞G棄值申窘,以便你的程序不會(huì)填滿內(nèi)存。 例如,當(dāng)處理一個(gè)百萬行的文件時(shí):

for 'filename'.IO.lines -> $line {
    do-something-with($line);
}

你可以確信文件的整個(gè)內(nèi)容不會(huì)留在內(nèi)存中,除非你明確地存儲(chǔ)某個(gè)地方的行。

另一方面,在某些情況下尽棕,您可能希望保留舊值蜗帜。 可以在列表中隱藏一個(gè) Seq材泄,它仍然是惰性的,但會(huì)記住舊的值白对。 這是通過調(diào)用 .list 方法完成的条摸。 由于此列表完全支持 Positional间驮,因此可以將其直接綁定到 @-sigiled 變量上刷钢。

my @s := (loop { 42 }).list;
@s[2]; # Says 42 three times
@s[1]; # does not say anything
@s[4]; # Says 42 two more times

您還可以使用 .cache 方法代替 .list笋颤,這取決于您希望處理引用的方式。 有關(guān)詳細(xì)信息内地,請參閱 Seq 上的頁面伴澄。

Slips

有時(shí)候你想把一個(gè)列表的元素插入到另一個(gè)列表中。 這可以通過一個(gè)稱為 Slip 的特殊類型的列表來完成阱缓。

say (1, (2, 3), 4) eqv (1, 2, 3, 4);         # says False
say (1, Slip.new(2, 3), 4) eqv (1, 2, 3, 4); # says True
say (1, slip(2, 3), 4) eqv (1, 2, 3, 4);     # also says True

另一種方法是使用 | 前綴運(yùn)算符非凌。 注意,這有一個(gè)比逗號(hào)更嚴(yán)格的優(yōu)先級(jí)荆针,所以它只影響一個(gè)單一的值敞嗡,但不像上面的選項(xiàng),它會(huì)打碎標(biāo)量航背。而 slip 不會(huì)喉悴。

say (1, |(2, 3), 4) eqv (1, 2, 3, 4);        # says True
say (1, |$(2, 3), 4) eqv (1, 2, 3, 4);       # also says True
say (1, slip($(2, 3)), 4) eqv (1, 2, 3, 4);  # says False

Lazy Lists

列表可以是惰性的,這意味著它們的值是根據(jù)需要計(jì)算的玖媚,并且存儲(chǔ)供以后使用箕肃。 要?jiǎng)?chuàng)建惰性列表,請使用 gather/take序列運(yùn)算符最盅。 您還可以編寫一個(gè)實(shí)現(xiàn) Iterable 角色的類突雪,并在調(diào)用 lazy 時(shí)返回 True起惕。 請注意涡贱,某些方法(如 elems)可能會(huì)導(dǎo)致整個(gè)列表計(jì)算失敗,如果列表也是無限的惹想。無限列表沒辦法知道它的元素個(gè)數(shù)问词。

my @l = 1,2,4,8...Inf;
say @l[0..16];
# OUTPUT?(1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768 65536)
?

Immutability

到目前為止我們談?wù)摰牧斜恚?code>List,SeqSlip)都是不可變的嘀粱。 這意味著您不能從中刪除元素激挪,或重新綁定現(xiàn)有元素:

(1, 2, 3)[0]:delete; # Error Can not remove elements from a List
(1, 2, 3)[0] := 0;   # Error Cannot use bind operator with this left-hand side
(1, 2, 3)[0] = 0;    # Error Cannot modify an immutable Int

但是辰狡,如果任何元素包裹在標(biāo)量中,您仍然可以更改 Scalar 指向的值:

my $a = 2;
(1, $a, 3)[1] = 42;
$a.say;            # says 42

...就是說垄分,它只是列表結(jié)構(gòu)本身 - 有多少個(gè)元素和每個(gè)元素的標(biāo)識(shí) - 是不可變的宛篇。 不變性不是通過元素的身份傳染。

List Contexts

到目前為止薄湿,我們主要是在中立語境下處理列表叫倍。 實(shí)際上列表在語法層面上上下文非常敏感。

List Assignment Context

當(dāng)一個(gè)列表出現(xiàn)在賦值給 @-sigiled 變量的右邊時(shí)豺瘤,它被“熱切地”計(jì)算吆倦。 這意味著 Seq 將被迭代,直到它不能產(chǎn)生更多的元素坐求。 這是你不想放置無限列表的地方之一蚕泽,免得你的程序掛起,最終耗盡內(nèi)存:

my $i = 3;
my @a = (loop { $i.say; last unless --$i }); # Says 3 2 1
say "take off!";

Flattening "Context"

當(dāng)您的列表包含子列表桥嗤,但您只想要一個(gè)平面列表時(shí)须妻,可以展平該列表以生成一系列值,就像所有的括號(hào)被刪除了一樣砸逊。 無論括號(hào)中有多少層次嵌套璧南,這都可以工作。

請注意师逸,列表周圍的標(biāo)量將使其免于扁平化:

for (1, (2, $(3, 4)), 5).flat { .say } # says 1, then 2, then (3 4), then 5

...但是一個(gè) @-sigiled 變量將溢出它的元素司倚。

my @l := 2, (3, 4);
for (1, @l, 5).flat { .say };      # says 1, then 2, then 3, then 4, then 5
my @a = 2, (3, 4);                 # Arrays are special, see below
for (1, @a, 5).flat { .say };      # says 1, then 2, then (3 4), then 5

Argument List (Capture) Context

當(dāng)列表作為函數(shù)或方法調(diào)用的參數(shù)出現(xiàn)時(shí),會(huì)使用特殊的語法規(guī)則:該列表立即轉(zhuǎn)換為 Capture篓像。 Capture 本身有一個(gè) List(.list)和一個(gè) Hash(.hash)动知。 任何鍵沒有引號(hào)的 Pair,或者沒有括號(hào)的 Pair 字面量员辩,永遠(yuǎn)不會(huì)變成 .list盒粮。 相反,它們被認(rèn)為是命名參數(shù)奠滑,并且壓縮為 .hash丹皱。 有關(guān)此處理的詳細(xì)信息,請參閱 Capture 上的頁面宋税。

考慮從列表中創(chuàng)建新數(shù)組的以下方法摊崭。 這些方法將 List 放在參數(shù)列表上下文中,因此杰赛,Array 只包含 1 和 2呢簸,但不包含 Pair :c(3),它被忽略。

Array.new(1, 2, :c(3));
Array.new: 1, 2, :c(3);
new Array: 1, 2, :c(3);

相反根时,這些方法不會(huì)將 List 放置在參數(shù)列表上下文中瘦赫,所以所有元素,甚至 Pair :c(3)蛤迎,都放置在數(shù)組中确虱。

Array.new((1, 2, :c(3)));
(1, 2, :c(3)).Array;
my @a = 1, 2, :c(3); Array.new(@a);
my @a = 1, 2, :c(3); Array.new: @a;
my @a = 1, 2, :c(3); new Array: @a;

在參數(shù)列表上下文中,應(yīng)用于 Positional 上的 | 前綴運(yùn)算符總是將列表元素slip為Capture的位置參數(shù)替裆,而應(yīng)用到 Associative 上的 | 前綴運(yùn)算符會(huì)把 pairs 作為具名參數(shù) slip 進(jìn)來:

`perl6
my @a := 2, "c" => 3;
Array.new(1, |@a, 4); # Array contains 1, 2, :c(3), 4
my %a = "c" => 3;
Array.new(1, |%a, 4); # Array contains 1, 4


### Slice Indexing Context

從[切片下標(biāo)](https://docs.perl6.org/language/subscripts#Slices) 中的 `List` 角度來看蝉娜,只有一個(gè)顯著的地方在于它是不可見的:因?yàn)橐粋€(gè)切片的副詞附在 `]` 后面,切片的內(nèi)部**不是**參數(shù)列表扎唾,并且沒有對 pair 形式的特殊處理 召川。

大多數(shù) `Positional` 類型將對切片索引的每個(gè)元素強(qiáng)制執(zhí)行整數(shù)強(qiáng)制,因此那兒出現(xiàn)的 pairs 將生成錯(cuò)誤胸遇,無論如何:

```perl6
(1, 2, 3)[1, 2, :c(3)] # Method 'Int' not found for invocant of class 'Pair'

...但是這完全取決于類型 - 如果它定義了pairs的順序荧呐,它可以考慮 :c(3) 是有效的索引。

切片內(nèi)的索引通常不會(huì)自動(dòng)展平纸镊,但是子列表通常不會(huì)強(qiáng)制為 Int倍阐。 相反,列表結(jié)構(gòu)保持不變逗威,從而導(dǎo)致在結(jié)果中重復(fù)結(jié)構(gòu)的嵌套 slice 操作:

say ("a", "b", "c")[(1, 2), (0, 1)] eqv (("b", "c"), ("a", "b")) # says True

Range as Slice

Range 是用于下邊界和上邊界的容器峰搪。 生成具有 Range 的切片將包括這些邊界之間的任何索引,包括邊界凯旭。 對于無限上限概耻,我們同意數(shù)學(xué)家 Inf 等于 Inf-1

my @a = 1..5;
say @a[0..2];     # (1 2 3)
say @a[0..^2];    # (1 2)
say @a[0..*];     # (1 2 3 4 5)
say @a[0..^*];    # (1 2 3 4 5)
say @a[0..Inf-1]; # (1 2 3 4 5)

Array Constructor Context

在數(shù)組字面量中罐呼,初始化值的列表不在捕獲上下文中鞠柄,只是一個(gè)正常的列表。 然而嫉柴,正如在賦值中一樣厌杜,急切地對它求值。

[ 1, 2, :c(3) ] eqv Array.new((1, 2, :c(3))) # says True
[while $++ < 2 { 42.say; 43 }].map: *.say;   # says 42 twice then 43 twice
(while $++ < 2 { 42.say; 43 }).map: *.say;   # says "42" then "43"
                                             # then "42" then "43"

它把我們帶到數(shù)組這兒來计螺。

Arrays

數(shù)組與列表在三個(gè)主要方面不同:它們的元素可以被類型化夯尽,它們自動(dòng)列出它們的元素,并且它們是可變的登馒。 否則匙握,它們是列表,并且在列表所在的位置被接受谊娇。

say Array ~~ List     # says True

第四種更微妙的方式是肺孤,當(dāng)使用數(shù)組時(shí),有時(shí)可能更難以維持惰性或使用無限序列济欢。

Typing

數(shù)組可以被類型化赠堵,使得它們的槽在被賦值時(shí)執(zhí)行類型檢查。 只允許分配 Int 值的數(shù)組是 Array[Int] 類型法褥,可以使用 Array[Int].new 創(chuàng)建一個(gè)數(shù)組茫叭。 如果你打算僅僅為了這個(gè)目的使用 @-sigiled 變量,你可以在聲明它時(shí)通過指定元素的類型來改變它的類型:

my Int @a = 1, 2, 3;              # An Array that contains only Ints
my @b := Array[Int].new(1, 2, 3); # Same thing, but the variable is not typed
say @b eqv @a;                    # says True.
my @c = 1, 2, 3;                  # An Array that can contain anything
say @b eqv @c;                    # says False because types do not match
say @c eqv (1, 2, 3);             # says False because one is a List
say @b eq @c;                     # says True, because eq only checks values
say @b eq (1, 2, 3);              # says True, because eq only checks values

@a[0] = 42;                       # fine
@a[0] = "foo";                    # error: Type check failed in assignment

在上面的例子中半等,我們將一個(gè)類型化的 Array 對象綁定到一個(gè)沒有指定類型的 @-sigil 變量上揍愁。 另一種方法不工作 - 你不能綁定一個(gè)類型錯(cuò)誤的數(shù)組到一個(gè)類型化的 @-sigiled 變量上:

my @a := Array[Int].new(1, 2, 3);     # fine
@a := Array[Str].new("a", "b");       # fine, can be re-bound
my Int @b := Array[Int].new(1, 2, 3); # fine
@b := Array.new(1, 2, 3);             # error: Type check failed in binding

當(dāng)使用類型化數(shù)組時(shí),重要的是要記住它們是名義類型的杀饵。 這意味著數(shù)組的聲明類型是重要的莽囤。 給定以下子聲明:

sub mean(Int @a) {
    @a.sum / @a.elems
}

傳遞 Array[Int] 的調(diào)用將成功:

my Int @b = 1, 3, 5;
say mean(@b);                       # @b is Array[Int]
say mean(Array[Int].new(1, 3, 5));  # Anonymous Array[Int]
say mean(my Int @ = 1, 3, 5);       # Another anonymous Array[Int]

但是,由于傳遞一個(gè)無類型的數(shù)組切距,下面的調(diào)用將全部失敗朽缎,即使該數(shù)組在傳遞時(shí)恰好包含 Int 值:

my @c = 1, 3, 5;
say mean(@c);                       # Fails, passing untyped Array
say mean([1, 3, 5]);                # Same
say mean(Array.new(1, 3, 5));       # Same again

請注意,在任何給定的編譯器中谜悟,可能有一些奇怪的话肖,底層的方法來繞過數(shù)組上的類型檢查,因此在處理不受信任的輸入時(shí)葡幸,執(zhí)行額外的類型檢查是一個(gè)很好的做法最筒,

for @a -> Int $i { $_++.say };

然而,只要你堅(jiān)持在一個(gè)信任的代碼區(qū)域內(nèi)的正常賦值操作蔚叨,這不會(huì)是一個(gè)問題床蜘,并且typecheck錯(cuò)誤將在分配到數(shù)組時(shí)發(fā)生,如果他們不能在編譯時(shí)捕獲蔑水。 在Perl 6中提供的用于操作列表的核心功能不應(yīng)該產(chǎn)生一個(gè)類型化的數(shù)組悄泥。

不存在的元素(當(dāng)索引時(shí))或已分配Nil的元素將采用默認(rèn)值。 可以使用 is default 特征在逐個(gè)變量的基礎(chǔ)上調(diào)整此默認(rèn)值肤粱。 請注意弹囚,無類型的@ -sigiled變量的元素類型為 Mu,但其默認(rèn)值為未定義的 Any

my @a;
@a.of.perl.say;                 # says "Mu"
@a.default.perl.say;            # says "Any"
@a[0].say;                      # says "(Any)"
my Numeric @n is default(Real);
@n.of.perl.say;                 # says "Numeric"
@n.default.perl.say;            # says "Real"
@n[0].say;                      # says "(Real)"

Fixed Size Arrays

要限制陣列的尺寸领曼,請?zhí)峁┯?,; 在數(shù)組容器的名稱后面的括號(hào)中鸥鹉。 這樣一個(gè)數(shù)組的值將默認(rèn)為 Any。 形狀可以在運(yùn)行時(shí)通過 shape 方法訪問庶骄。

my @a[2,2];
dd @a;
# OUTPUT?Array.new(:shape(2, 2), [Any, Any], [Any, Any])
?
say @a.shape;
# OUTPUT?(2 2)
?

賦值到固定大小的數(shù)組將把一個(gè)列表的列表提升為數(shù)組的數(shù)組毁渗。

my @a[2;2] = (1,2; 3,4);
@a[1;1] = 42;
dd @a;
# OUTPUT?Array.new(:shape(2, 2), [1, 2], [3, 42])
?

Itemization

對于大多數(shù)用途,數(shù)組由多個(gè)槽組成单刁,每個(gè)槽包含正確類型的標(biāo)量灸异。 每個(gè)這樣的標(biāo)量,反過來,包含該類型的值肺樟。 當(dāng)數(shù)組被初始化檐春,賦值或構(gòu)造時(shí),Perl 6 將自動(dòng)進(jìn)行類型檢查值并創(chuàng)建標(biāo)量來包含它們么伯。

這實(shí)際上是 Perl 6 列表處理中最棘手的部分之一疟暖,以獲得牢固的理解。

首先田柔,請注意俐巴,因?yàn)榧僭O(shè)數(shù)組中的項(xiàng)目化,它本質(zhì)上意味著 $(...) 被放置在您分配給數(shù)組的所有內(nèi)容硬爆,如果你不把它們放在那里欣舵。 另一方面,Array.perl 不會(huì)將$顯式地顯示標(biāo)量缀磕,與 List.perl 不同:

((1, 2), $(3, 4)).perl.say; # says "((1, 2), $(3, 4))"
[(1, 2), $(3, 4)].perl.say; # says "[(1, 2), (3, 4)]"
                            # ...but actually means: "[$(1, 2), $(3, 4)]"

它決定所有這些額外的美元符號(hào)和括號(hào)更多的眼睛疼痛比對用戶的好處邻遏。 基本上,當(dāng)你看到一個(gè)方括號(hào)虐骑,記住隱形美元符號(hào)准验。

第二,記住這些看不見的美元符號(hào)也防止扁平化廷没,所以你不能真正地扁平化一個(gè)數(shù)組內(nèi)的元素與正常調(diào)用 flat.flat糊饱。

((1, 2), $(3, 4)).flat.perl.say; # (1, 2, $(3, 4)).Seq
[(1, 2), $(3, 4)].flat.perl.say; # ($(1, 2), $(3, 4)).Seq

由于方括號(hào)本身不會(huì)防止展平,因此您仍然可以使用平面將數(shù)組中的元素溢出到周圍的列表中颠黎。

(0, [(1, 2), $(3, 4)], 5).flat.perl.say; # (0, $(1, 2), $(3, 4), 5).Seq

...元素本身另锋,但是,留在一塊狭归。

這可以阻止用戶提供的數(shù)據(jù)夭坪,如果你有深嵌套的數(shù)組他們想要平面數(shù)據(jù)。 目前过椎,他們必須手動(dòng)地深度地映射結(jié)構(gòu)以撤消嵌套:

say gather [0, [(1, 2), [3, 4]], $(5, 6)].deepmap: *.take; # (1 2 3 4 5 6)

...未來版本的 Perl 6 可能會(huì)找到一種使這更容易的方法室梅。 但是,當(dāng) non-itemized 列表足夠時(shí)疚宇,不從函數(shù)返回?cái)?shù)組或 itemized 列表亡鼠,這是一個(gè)應(yīng)該考慮作為好意給他們的用戶:

  • 當(dāng)您總是想要與周圍列表合并時(shí)使用 Slips
  • 使用 non-itemized 列表,當(dāng)你想讓用戶容易展平時(shí)
  • 使用 itemized 列表來保護(hù)用戶可能不想展平的東西
  • 使用數(shù)組作為 non-itemized 列表的 non-itemized 列表敷待,如果合適
  • 如果用戶想要改變結(jié)果而不首先復(fù)制結(jié)果间涵,請使用數(shù)組。

事實(shí)上榜揖,數(shù)組的所有元素(在Scalar容器中)是一個(gè)紳士的協(xié)議勾哩,而不是一個(gè)普遍強(qiáng)制的規(guī)則抗蠢,并且在類型數(shù)組中的類型檢查不太好。 請參閱下面有關(guān)綁定到陣列插槽的部分思劳。

Literal Arrays

字面數(shù)組是用方括號(hào)內(nèi)的 List 構(gòu)造的迅矛。 列表被熱切地迭代(如果可能,在編譯時(shí))敢艰,并且列表中的值每個(gè)都進(jìn)行類型檢查和itemized。 在展平時(shí), 方括號(hào)本身會(huì)將元素放入周圍的列表中册赛,但是元素本身不會(huì)因?yàn)?itemization 化而溢出钠导。

Mutability

與列表不同,數(shù)組是可變的森瘪。 元素可以刪除牡属,添加或更改。

my @a = "a", "b", "c";
@a.say;                  # [a b c]
@a.pop.say;              # says "c"
@a.say;                  # says "[a b]"
@a.push("d");
@a.say;                  # says "[a b d]"
@a[1, 3] = "c", "c";
@a.say;                  # says "[a c d c]"

Assigning

列表到數(shù)組的分配是急切的扼睬。 該列表將被完全求值逮栅,并且數(shù)組不應(yīng)該是無限的否則程序可能掛起。 類似地窗宇,對陣列的分片的分配是急切的措伐,但是僅僅達(dá)到所請求數(shù)量的元素,其可以是有限的:

my @a;
@a[0, 1, 2] = (loop { 42 });
@a.say;                     # says "[42 42 42]"

在賦值期間军俊,每個(gè)值都將進(jìn)行類型檢查侥加,以確保它是 Array 允許的類型。 任何標(biāo)量將從每個(gè)值中剝離粪躬,一個(gè)新的標(biāo)量將被包裹担败。

Binding

單個(gè)數(shù)組槽可以以相同的方式綁定 $-sigiled 變量:

my $b = "foo";
my @a = 1, 2, 3;
@a[2] := $b;
@a.say;          # says '[1 2 "foo"]'
$b = "bar";
@a.say;          # says '[1 2 "bar"]'

...但強(qiáng)烈不建議將 Array 槽直接綁定到值。 如果你這樣做镰官,預(yù)期內(nèi)置函數(shù)的驚喜提前。 只有當(dāng)需要知道值和Scalar-Wrapped值之間的差異的可變?nèi)萜鲿r(shí)镀虐,或者對于不能使用本地類型數(shù)組的非常大的Arrays恢筝,才需要執(zhí)行此操作扩然。 這樣的生物永遠(yuǎn)不應(yīng)該被傳遞回不知情的用戶纵隔。

說明: 本文使用谷歌翻譯, 有人工刪改, 語句生硬谆沃、不通之煩處請指出匀借。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末乘碑,一起剝皮案震驚了整個(gè)濱河市熊镣,隨后出現(xiàn)的幾起案子扇雕,更是在濱河造成了極大的恐慌拓售,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件镶奉,死亡現(xiàn)場離奇詭異础淤,居然都是意外死亡崭放,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門鸽凶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來币砂,“玉大人,你說我怎么就攤上這事玻侥【龃荩” “怎么了?”我有些...
    開封第一講書人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵凑兰,是天一觀的道長掌桩。 經(jīng)常有香客問我,道長姑食,這世上最難降的妖魔是什么波岛? 我笑而不...
    開封第一講書人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮音半,結(jié)果婚禮上则拷,老公的妹妹穿的比我還像新娘。我一直安慰自己曹鸠,他們只是感情好煌茬,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著彻桃,像睡著了一般宣旱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上叛薯,一...
    開封第一講書人閱讀 51,274評(píng)論 1 300
  • 那天浑吟,我揣著相機(jī)與錄音,去河邊找鬼耗溜。 笑死组力,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的抖拴。 我是一名探鬼主播燎字,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼阿宅!你這毒婦竟也來了候衍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬榮一對情侶失蹤洒放,失蹤者是張志新(化名)和其女友劉穎蛉鹿,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體往湿,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡妖异,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年惋戏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片他膳。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡响逢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出棕孙,到底是詐尸還是另有隱情舔亭,我是刑警寧澤,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布蟀俊,位于F島的核電站钦铺,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏欧漱。R本人自食惡果不足惜职抡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一葬燎、第九天 我趴在偏房一處隱蔽的房頂上張望误甚。 院中可真熱鬧,春花似錦谱净、人聲如沸窑邦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽冈钦。三九已至,卻和暖如春李请,著一層夾襖步出監(jiān)牢的瞬間瞧筛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來泰國打工导盅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留较幌,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓白翻,卻偏偏與公主長得像乍炉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子滤馍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 從匹配中返回值 Match 對象 成功的匹配總是返回一個(gè) Match 對象, 這個(gè)對象通常也被放進(jìn) $/ 中, (...
    焉知非魚閱讀 1,800評(píng)論 0 1
  • 翻譯自 perl6maven.com exit岛琼,warn,die exit die Hello World Hel...
    焉知非魚閱讀 2,490評(píng)論 2 7
  • 2009 有用的和有意思的循環(huán) 讓我們來看一個(gè)基本的例子. 這是一個(gè)最簡單清晰的語法的例子.在這并沒有使用括號(hào)來包...
    焉知非魚閱讀 549評(píng)論 0 0
  • 標(biāo)題: Rakudo and NQP Internals子標(biāo)題: The guts tormented imple...
    焉知非魚閱讀 1,374評(píng)論 1 3
  • 一隻貓來到我正在寫作的房間門口巢株。 它停下來槐瑞,猶豫了一會(huì),繼續(xù)走動(dòng)阁苞。 它盯著我看随珠。 我們互相盯著看灭袁。 直勾勾地盯著,...
    東豐林波閱讀 168評(píng)論 0 0