&func 调用与 func 调用的差别
时间:2010-09-09
来源:互联网
本帖最后由 黑色阳光_cu 于 2010-09-09 09:26 编辑
一般情况下,函数调用时,@_会先被局部化,只有一种情况下不会,就是用&方式调用又没有提供参数列表时:
复制代码
所以,&func 能访问到外部的@_,也能修改。&func 类似于 &func(@_) 又不全等。猜测 &func 是老式的调用风格,为了和原来的行为一致,不提供参数列表就用@_,所以不局部化@_,不给@_绑定新值。
而在函数里,假定@_被重新赋值的话:
复制代码
$_[0]相当于常量1的别名,修改$_[0]等于修改常量1,
$_[1]相当于常量2的别名,修改$_[1]等于修改常量2,
$_[2]相当于常量3的别名,修改$_[2]等于修改常量3,
那 @_ = (4, 5, 6)
相当于 ($_[0], $_[1], $_[2]) = (4, 5, 6) ?
等于修改常量的值?
不,当@_被重新赋值时,@_会先被清空。所以,@_ = (4, 5, 6) 不会引起问题,不会修改实参的值。而 ($_[0], $_[1], $_[2]) = (4, 5, 6) 可以修改实参的值,假如是实参是常量的话,引起语法错。
一般情况下,函数调用时,@_会先被局部化,只有一种情况下不会,就是用&方式调用又没有提供参数列表时:
- sub func
- {
- warn \@_;
- }
-
- @_ = (1, 2, 3);
- warn \@_;
- print "\n";
-
- func();
- func;
- &func();
- &func;
而在函数里,假定@_被重新赋值的话:
- sub func
- {
- warn \$_[0];
- @_ = (4, 5, 6);
- #($_[0], $_[1], $_[2]) = (4, 5, 6);
- warn \$_[0];
- }
-
- func(1, 2, 3);
$_[1]相当于常量2的别名,修改$_[1]等于修改常量2,
$_[2]相当于常量3的别名,修改$_[2]等于修改常量3,
那 @_ = (4, 5, 6)
相当于 ($_[0], $_[1], $_[2]) = (4, 5, 6) ?
等于修改常量的值?
不,当@_被重新赋值时,@_会先被清空。所以,@_ = (4, 5, 6) 不会引起问题,不会修改实参的值。而 ($_[0], $_[1], $_[2]) = (4, 5, 6) 可以修改实参的值,假如是实参是常量的话,引起语法错。
作者: 黑色阳光_cu 发布时间: 2010-09-09

作者: iamlimeng 发布时间: 2010-09-09
本帖最后由 Mr-Summer 于 2010-09-09 10:36 编辑
第一个不太懂。
结果是四个引用都不同。func()和&func()是重新分配空列表。func约等于func(@_),但是func和&func为啥返回的地址也不同?
=========================
记错了,func也是给了给空列表

结果是四个引用都不同。func()和&func()是重新分配空列表。func约等于func(@_),但是func和&func为啥返回的地址也不同?
=========================
记错了,func也是给了给空列表
作者: Mr-Summer 发布时间: 2010-09-09
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28