免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2813 | 回复: 7

证明空列表在 SCALAR 上下文返回 undef [复制链接]

论坛徽章:
0
发表于 2011-03-01 20:45 |显示全部楼层
  1. #!/bin/env perl

  2. use strict;
  3. no warnings;

  4. my $i  = (1, 2, 3, ());
  5. my $j  = (1, 2, 3, );
  6. my $k = (1, 2, 3, func());

  7. print "\$i = $i\n";
  8. print "\$j = $j\n";
  9. print "\$k = $k\n";

  10. my @ar = (1, 2, 3, func());
  11. print "Size of \@ar: ", scalar(@ar), "\n";

  12. my @ar2 = (1, 2, 3, func2());
  13. print "Size of \@ar2: ", scalar(@ar2), "\n";

  14. sub func
  15. {
  16.         return;
  17. }

  18. sub func2
  19. {
  20.         return undef;
  21. }
复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2011-03-01 22:49 |显示全部楼层
错了。

建议学学 C 语言,看看 Perl 解释器的实现。

perldoc -f wantarray
perldoc -f return

上面两段文档可以解释除 my $i = 这一行之外的其余所有代码。

这一行代码的解释在下面:
  1. D:\MoChou>perl -MO=Deparse -e "$i = (1,2,3,())"
  2. $i = ('???', '???', '???', ());
  3. -e syntax OK

  4. D:\MoChou>
复制代码

论坛徽章:
7
巳蛇
日期:2014-04-10 08:54:57白羊座
日期:2014-04-22 20:06:262015年亚洲杯之沙特阿拉伯
日期:2015-02-10 14:18:532015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之吉达阿赫利
日期:2015-06-02 11:34:112015亚冠之武里南联
日期:2015-06-24 12:13:082015亚冠之阿尔纳斯尔
日期:2015-08-03 09:08:25
发表于 2011-03-01 23:23 |显示全部楼层
回复 1# 黑色阳光_cu

证明这个,只需要一行就够了:
  1. perl -E 'my $i = (); say "defined" if defined $i'
复制代码

论坛徽章:
0
发表于 2011-03-02 00:25 |显示全部楼层
错了。

建议学学 C 语言,看看 Perl 解释器的实现。

perldoc -f wantarray
perldoc -f return

上 ...
flw 发表于 2011-03-01 22:49



{:3_187:}

我主要就是测试 my $i  = (1, 2, 3, ()) 其它都是为了对比而已。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2011-03-02 01:06 |显示全部楼层
这个对比恰恰说明了你的逻辑不清楚 or 认识不到位。
完全不一样的东西,你单独把 () 拿出来说事儿(如同三楼一样),也许还是一个命题,
但把它和 return 放在一起,不得不让人怀疑你对上下文的理解以及 return 的行为是否有误。

另外,即使你测出了 () 的作用,也难以称它是“空列表在 SCALAR 上下文”中的行为。
恰恰相反,当时的 () 位于 LIST 上下文。

至于 () 在 () 中嵌套时的行为,用 B:Terse 或者 B:Deparse 都可以比较清楚地观察到。

论坛徽章:
0
发表于 2011-03-02 03:44 |显示全部楼层
本帖最后由 黑色阳光_cu 于 2011-03-02 03:58 编辑
这个对比恰恰说明了你的逻辑不清楚 or 认识不到位。
完全不一样的东西,你单独把 () 拿出来说事儿(如同三 ...
flw 发表于 2011-03-02 01:06



LIST 上下文?
  1. #!/bin/env perl

  2. use strict;
  3. no warnings;

  4. my $i  = (1, 2, 3, ());
  5. my $j  = (1, 2, 3, probe());

  6. sub probe
  7. {
  8.         my $rt = wantarray();
  9.         if (not defined $rt)
  10.         {
  11.                 print "VOID\n";
  12.         }
  13.         elsif (not $rt)
  14.         {
  15.                 print "SCALAR\n";
  16.         }
  17.         else
  18.         {
  19.                 print "LIST\n";
  20.         }

  21.         return;
  22. }
复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2011-03-02 08:12 |显示全部楼层
你又把 () 和 foo() 混为一谈了。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2011-03-02 08:18 |显示全部楼层
记住,上下文是传递的。
  1. D:\MoChou>perl -MO=Terse -e "$i = (1,2,3,())"
  2. LISTOP (0x1935a3c) leave [1]
  3.     OP (0x1935a20) enter
  4.     COP (0x1935a60) nextstate
  5.     BINOP (0x1935a9c) sassign
  6.         LISTOP (0x1935b18) list
  7.             OP (0x1935afc) pushmark
  8.             OP (0x1935b5c) null [5]
  9.             OP (0x1935b3c) null [5]
  10.             OP (0x1935adc) null [5]
  11.             OP (0x1935ac0) stub
  12.         UNOP (0x1935b7c) null [15]
  13.             PADOP (0x1935b9c) gvsv  GV (0x1830e54) *i
  14. -e syntax OK

  15. D:\MoChou>perl -MO=Terse -e "$i = (1,2,3,foo())"
  16. LISTOP (0x19359b8) leave [1]
  17.     OP (0x193599c) enter
  18.     COP (0x19359dc) nextstate
  19.     BINOP (0x1935a18) sassign
  20.         LISTOP (0x1935b18) list
  21.             OP (0x1935afc) pushmark
  22.             OP (0x1935b5c) null [5]
  23.             OP (0x1935b3c) null [5]
  24.             OP (0x1935adc) null [5]
  25.             UNOP (0x1935a3c) entersub [3]
  26.                 UNOP (0x1935a78) null [141]
  27.                     OP (0x1935a5c) pushmark
  28.                     UNOP (0x1935a9c) null [17]
  29.                         PADOP (0x1935abc) gv  GV (0x1830e18) *foo
  30.         UNOP (0x1935b7c) null [15]
  31.             PADOP (0x1935b9c) gvsv  GV (0x1830e54) *i
  32. -e syntax OK

  33. D:\MoChou>
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP