U. *_*ndl 6 perl evaluation parameter-passing
Perl 5.18.2 文档splice有这个例子:
my(@a) = splice(@_,0,shift);\nmy(@b) = splice(@_,0,shift);\nRun Code Online (Sandbox Code Playgroud)\n我想知道:\n如果@_在之前进行评估,shift则有一项太多,结果将无法正确。\n因此从概念上讲,必须shift首先执行。\n但是,在 C 中,他们告诉您永远不应该依赖于特定的顺序实际参数的评估(shift修改@_)。
那么,该代码是否只能工作,因为@_它作为引用传递(以便能够更改它),并且shift之前被评估的代码splice可以访问@_?
我发现这个例子可以追溯到 1996 年(至少)和这本书(第 219 页;第 535 页的评论表明它甚至可能来自 Perl 4):
\n\n\nWALL、Larry、Tom CHRISTIANSEN 和 Randal L. SCHWARTZ,1996 年。Perl 编程。2. 塞瓦斯托波尔,CA 95472,美国:O\xe2\x80\x99Reilly & Associates, Inc. ISBN\xc2\xa01-56592-149-6
\n
因为@_它本身正在被传递splice(而不是被展平或复制),因为splice预计会对其进行修改。
对于普通的子例程,参数列表中的数组将被展平。Butsplice是一个运算符,因此它不限于子例程的行为。
Perl 提供了数组来splice代替。而且不是它的副本。数组本身被放置在堆栈上。这允许对其进行修改,而且作为奖励,它的效率更高。
(在 C 语言中,“数组”是一个指针。所有 Perl 变量都是指针。事实上,只有指针在底层进行交换,这就是 Perl 表现出引用传递语义的原因。)
\nPerl 从左到右评估列表,因此@_将其放入堆栈,然后0将其放入堆栈,然后shift评估修改@_并将删除的值放入堆栈。
@_当在堆栈上找到它时,修改它并不重要。只要这些事情发生在splice执行 \xe2\x80\x94 之前,并且它们是 \xe2\x80\x94 ,它就可以正常工作。
| 归档时间: |
|
| 查看次数: |
131 次 |
| 最近记录: |