我想编写一个Perl子例程 first
,它将列表作为输入,返回列表中的第一个元素并从列表中删除第一个元素 .
像这样:
@list = (1,2,3);
print first(@list); // 1
print @list; // 23
这不太合适:
sub first(@) {
return shift @_;
}
我得到的是:
print first(@list); // 1
print @list; // 123
堆栈变量@_改变了我期望它的方式(首先它是 (1, 2, 3)
然后它是 (2, 3)
),但是我作为输入( @list
)给出的列表没有改变 . 我认为堆栈变量保存对它引用的变量的引用 .
当我更改子例程中的列表元素时,它也会更改 @list
中的某些内容,但不会更改我想要的内容,但是那个1.所以如果我在子例程中写入:
@_[0] = "X";
并且在执行子程序print @list
之后,我会得到 2X6
.
2 回答
您需要在
@
原型前面添加斜杠以获取数组引用,然后修改引用 . 如果您只使用@
,您将在子例程中获得数组@list
的副本(因此不会修改父级中的数组) . 来自http://perldoc.perl.org/perlsub.html#Prototypes:所以你可以写:
输出:
你没有列表,你有阵列 . Perl中的数组和列表是不同的(正如great blog post解释的那样) . 如果你有一个名为
@list
的数组,那么你肯定会让自己感到困惑(以及将来维护你的代码的人) .