【发布时间】:2015-01-06 10:07:29
【问题描述】:
我想编写一个 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";
在执行子程序打印@list后,我会得到2X6。
【问题讨论】:
-
为什么不使用
shift来实现呢? -
这就是我在子程序中所做的
-
但是为什么要编写子程序呢?什么时候可以简单地使用
shift?
标签: perl parameters subroutine