免费注册 查看新帖 |

Chinaunix

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

关于sub的疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-04 10:30 |只看该作者 |倒序浏览
有以下sub定义:

sub sub1($\@$){
        my($var1, $var2, $var3) = @_;
       
        print "var1: ". $var1. "\n";
        print "var2: ". $var2. "\n";
        print "var3: ". $var3. "\n"; # 如果取返回值,会得到1:print成功
       
}

我在定义之后调用,总报错:
# error message: Type of arg 2 to main::sub1 must be array (not private variable)
my $array = [1, 2, 3];
sub1('a', $array,'b');

# error message: Type of arg 2 to main::sub1 must be array (not reference constructor)
my @arrya = (1, 2, 3);
sub1('a', \@arrya, 'b');

总不能用这样去调吧:
sub1('a', (1, 2, 3), 'b');
# 地球人都知道这种调法还不如去死... :wink:

谁知道在指定了参数为数组引用的时候怎么调用啊?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2008-06-04 10:51 |只看该作者
sub1( 'a', @array, 'b' );

论坛徽章:
0
3 [报告]
发表于 2008-06-04 11:03 |只看该作者
sub t {
        my $t1 = shift;
        my $t2 = shift;
        my $t3 = shift;
       
        print "$t1 $t2 $t3";
}

my $t1 = [1, 3, 4];
my $t2 = 'a';
my $t3 = '100';

t($t1, $t2, $t3);

这样没问题,估计你函数定义时出错了 不用 ($\@$) 这样的,自己查书吧

论坛徽章:
0
4 [报告]
发表于 2008-06-04 12:53 |只看该作者

回复 #1 johnrobbet 的帖子

你定义sub的时候使用了prototype
sub (\@)
这样定义以后传经去的参数一定要是一个以@打头的list(但其实sub里面得到的只是一个引用)
你需要在sub里面自己deference

见下面的例子

  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. sub proto ( \@ ) {
  5. print "@{+shift}","\n";
  6. }

  7. my @att = qw ( one two three );
  8. proto (@att);
复制代码

[ 本帖最后由 churchmice 于 2008-6-4 12:57 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2008-06-04 16:57 |只看该作者
原帖由 churchmice 于 2008-6-4 12:53 发表
你定义sub的时候使用了prototype
sub (\@)
这样定义以后传经去的参数一定要是一个以@打头的list(但其实sub里面得到的只是一个引用)
你需要在sub里面自己deference

见下面的例子

#!/usr/bin/perl
use ...


嗯,明白了,谢谢大家!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP