免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1709 | 回复: 4
打印 上一主题 下一主题

Perl subroutine arguments [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-12-28 16:05 |只看该作者 |倒序浏览
本帖最后由 gaoyang636 于 2012-12-28 16:08 编辑

看C中有类似这种用法:main调用子程序时,传入参数1为一个数组(例如,储存某行的字符)。而子程序的返回值为一个数字(例如某行的长度)。这个数组并不需要做任何操作,在main和sub中都可以拿来直接操作的,貌似没在Perl中见到类似的用法,我接触到的subroutine(不包括面向对象的),需要返回一个array时,都是通过子程序最后返回值进行操作的。新手不确定,特来请教各位是不是这样子的呢?
例子代码:
  1. main () {
  2. .......
  3. while ((len=getline(array,100)>0){
  4.   if (len>max) {
  5.     max=len;
  6.     some operations on array
  7.    ...}
  8. }

  9. #子程序
  10. int getline  (char s[],int lim){
  11.    ....
  12.    for (i=>;i<lim && (c=getchar())!=EOF;++i){
  13.     s[i]=c;
  14. }
  15. ....
  16. return i;
  17. }
复制代码

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
2 [报告]
发表于 2012-12-28 16:13 |只看该作者
Perl 中可以直接用操作 @_ 相当于别名,和你上面C的例子效果一样,注意只能用 $_[X] 这样的方式。也可以用 prototype 把传入的变量自动转成引用。

比如
my $k = 1;

say $k; # 1

sub add1 { $_[0] ++ }

add1 $k; # 2
say $k;

sub add2 (\$) {
    my $ref = shift;
    $$ref +=2;
}

add2 $k;
say $k; # 4

论坛徽章:
0
3 [报告]
发表于 2012-12-28 16:20 |只看该作者
回复 2# zhlong8


    嗯,清晰明了,谢谢版主 操作@_直接就能更改原变量的值,我很容易就出错了

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
4 [报告]
发表于 2012-12-28 16:27 |只看该作者
回复 3# gaoyang636


    经常用 my($a, $b) = @_; 其实是复制了参数所以不会出问题。如果参数是常量那 add1 相当于修改常量是运行时错误,对于 add2 连元型都不匹配是编译期错误。

论坛徽章:
0
5 [报告]
发表于 2012-12-31 10:27 |只看该作者
回复 4# zhlong8


    原来如此,谢谢指教:wink:
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP