免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: py
打印 上一主题 下一主题

函数在返回数组的时候遇到了问题。。。大家都来看看:) [复制链接]

论坛徽章:
0
21 [报告]
发表于 2010-08-05 14:49 |只看该作者
  1. sub func
  2. {
  3.         my @ar = qw/a b c/;
  4.         return @ar;
  5. }


  6. sub func2 :lvalue
  7. {
  8.         my @ar = qw/a b c/;
  9.         @ar;
  10. }

  11. warn \func();
  12. warn \func2();
复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
22 [报告]
发表于 2010-08-05 14:55 |只看该作者
ft~
有这么麻烦嘛,与什么上下文无关,就一点: list是 value,array 是 variable!
由于 shift 要修改传 ...
dugu072_cu 发表于 2010-08-05 14:40



说“上下文”的时候,说的是另一个问题,是在说scalar的输出结果为什么会不同。

你这个解释很有道理,呵呵。。。

之前我一直认为foreach的行为就相当于shift的行为,但显然不是。。。 shift就是pop,是要对数组进行修改的,foreach只是读而已。

试了下,shift (qw/a b c/)是会报错的,提示shift must be array (not list)

论坛徽章:
0
23 [报告]
发表于 2010-08-05 14:57 |只看该作者
正如我所料

sub func2 :lvalue
{
        my @ar = qw/a b c/;
        @ar;
}

虽然func2是返回array了,但是

shift(func());

还是报错,因为编译时不能确定func2返回什么。

论坛徽章:
0
24 [报告]
发表于 2010-08-05 15:44 |只看该作者
黑色阳光_cu 是对的。编译不通过是因为:
shift(func()); 失败是因为shift的参数只能是array.而不是一个表达式, 而func()是一个表达式。


不是返回参数能不能修改的原因。下面例子可以解释:
  1. foreach my $tt(qw(1 3 5)){
  2. print $tt."\n";
  3. #$tt=1;
  4. }
复制代码
去掉注释就运行失败,因为qw是value,是只读的。
但函数返回值并不是只读的。看下面例子:
  1. sub function {
  2.     my @temp = qw/a b c/;
  3.     return @temp;
  4. }
  5. foreach my $var(function) {
  6.     print "$var\n";
  7.     $var=1;
  8. }
复制代码

论坛徽章:
0
25 [报告]
发表于 2010-08-05 15:54 |只看该作者
顺便说一下 ..  产生的列表不是只读的

foreach my $elem (1 .. 10)
{
        $elem = 1;
}

论坛徽章:
0
26 [报告]
发表于 2010-08-05 16:08 |只看该作者
:emn1:不应该说表达式  应该说函数调用 o(∩_∩)o...

论坛徽章:
0
27 [报告]
发表于 2010-08-05 17:02 |只看该作者
黑色阳光_cu 是对的。编译不通过是因为:
shift(func()); 失败是因为shift的参数只能是array.而不是一个表 ...
toniz 发表于 2010-08-05 15:44



    黑色阳光_cu 的 warn \func(); ,说明了 return 确实是返回 list;但结合你给的代码,反而很难理解了:为什么 return 回来的 list,这里却可以修改?

论坛徽章:
0
28 [报告]
发表于 2010-08-05 17:15 |只看该作者
因为作为参数传递的是临时变量。

论坛徽章:
1
狮子座
日期:2013-12-16 16:09:24
29 [报告]
发表于 2010-08-05 18:02 |只看该作者
Perl 内部做了很NB的优化,有点看不懂了

  1. warn "======qw======";
  2. for (qw(1 2 3 4)){
  3. warn $_;
  4. warn \$_;
  5. }
  6. warn "========..======";
  7. for (1..4){
  8. warn $_;
  9. warn \$_;
  10. }
复制代码
  1. ./x.pl
  2. ======qw====== at ./x.pl line 9.
  3. 1 at ./x.pl line 11.
  4. SCALAR(0x8166c28) at ./x.pl line 12.
  5. 2 at ./x.pl line 11.
  6. SCALAR(0x8166d48) at ./x.pl line 12.
  7. 3 at ./x.pl line 11.
  8. SCALAR(0x8166c28) at ./x.pl line 12.
  9. 4 at ./x.pl line 11.
  10. SCALAR(0x8166d48) at ./x.pl line 12.
  11. ========..====== at ./x.pl line 14.
  12. 1 at ./x.pl line 16.
  13. SCALAR(0x81677ec) at ./x.pl line 17.
  14. 2 at ./x.pl line 16.
  15. SCALAR(0x81677ec) at ./x.pl line 17.
  16. 3 at ./x.pl line 16.
  17. SCALAR(0x81677ec) at ./x.pl line 17.
  18. 4 at ./x.pl line 16.
  19. SCALAR(0x81677ec) at ./x.pl line 17.
复制代码

论坛徽章:
78
双子座
日期:2013-10-15 08:50:09天秤座
日期:2013-10-16 18:02:08白羊座
日期:2013-10-18 13:35:33天蝎座
日期:2013-10-18 13:37:06狮子座
日期:2013-10-18 13:40:31双子座
日期:2013-10-22 13:58:42戌狗
日期:2013-10-22 18:50:04CU十二周年纪念徽章
日期:2013-10-24 15:41:34巨蟹座
日期:2013-10-24 17:14:56处女座
日期:2013-10-24 17:15:30双子座
日期:2013-10-25 13:49:39午马
日期:2013-10-28 15:02:15
30 [报告]
发表于 2010-08-05 18:06 |只看该作者
回复 24# toniz


    为什么qw是value呢?qw(1 2 3)和(1..3)的区别呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP