列表一直是計(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
要測試元素將 List
或 Array
轉(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,Seq
和 Slip
)都是不可變的嘀粱。 這意味著您不能從中刪除元素激挪,或重新綁定現(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)該被傳遞回不知情的用戶纵隔。
說明: 本文使用谷歌翻譯, 有人工刪改, 語句生硬谆沃、不通之煩處請指出匀借。