免费注册 查看新帖 |

Chinaunix

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

新手求助解引用相关问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-04-09 08:37 |只看该作者 |倒序浏览
在看代码的时候发现有如下写法,
1 $$ref[ $idx ]
2 $$ref{ $name }
3 $$ref{ $name }{"index"}
4 $$ref{"block"}[ $block_idx ]{"name"}

请问各代表什么含义?多谢

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
2 [报告]
发表于 2015-04-09 16:42 |只看该作者
本帖最后由 104359176 于 2015-04-09 16:45 编辑

这些都是极其不常用的写法,不推荐学习,例如:
  1. $ref[ $idx ] => @ref 第 $idx -1 个元素的值作为变量名。
复制代码
在 PHP 和 Lua 中,以变量返回的字符串为变量名比较常见,因为这两门语言的符号表是透明的,但其他语言并不是这样。
对符号表的操作很容易导致隐含的全局(局部)变量的覆盖,是极其危险的做法。

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
3 [报告]
发表于 2015-04-18 06:16 |只看该作者
本帖最后由 rubyish 于 2015-04-18 02:17 编辑
  1. #!/usr/bin/perl
  2. use 5.016;

  3. my $r1 = [ 1, 2, 3 ];
  4. my $idx = 1;

  5. say $$r1[$idx];      # 2
  6. say ${$r1}[$idx];    # 2
  7. say $r1->[$idx];     # 2
  8. say $$r1[1];         # 2

  9. my $r2 = { a => 1, b => 2 };
  10. my $name = 'a';

  11. say $$r2{$name};      # 1
  12. say ${$r2}{$name};    # 1
  13. say $r2->{$name};     # 1
  14. say $r2->{'a'};       # 1
  15. say $r2->{a};         # 1

  16. my $r3 = { a => { b => 1, c => 2 }, b => { x => 1, d => 3 } };
  17. my $nam = 'a';

  18. say $$r3{$nam}{b};           # 1
  19. say ${$r3}{$nam}{b};         # 1
  20. say ${ ${$r3}{$nam} }{b};    # 1
  21. say $$r3{$nam}{'b'};         # 1
  22. say $r3->{$nam}{b};          # 1
  23. say $r3->{$nam}->{b};        # 1
  24. say ${ $r3->{$nam} }{b};     # 1

  25. my $r4 = {
  26.     a => [ { c => 1, d => 2 }, { a => 5, n => 77 } ],
  27.     b => [ { c => 4, d => 6 }, { a => 3, n => 22 } ]
  28. };
  29. my $block_idx = 0;

  30. say $$r4{'a'}[$block_idx]{'c'};            # 1
  31. say $$r4{a}[$block_idx]{c};                # 1
  32. say ${$r4}{a}[$block_idx]{c};              # 1
  33. say ${ $$r4{a} }[$block_idx]{c};           # 1
  34. say ${ ${$r4}{a} }[$block_idx]{c};         # 1
  35. say ${ $$r4{a}[$block_idx] }{c};           # 1
  36. say ${ ${$r4}{a}[$block_idx] }{c};         # 1
  37. say ${ ${ ${$r4}{a} }[$block_idx] }{c};    # 1
  38. say ${ $r4->{a} }[$block_idx]{c};          # 1
  39. say ${ ${ $r4->{a} }[$block_idx] }{c};     # 1
  40. say $r4->{a}[$block_idx]{c};               # 1
  41. say $r4->{a}->[$block_idx]{c};             # 1
  42. say $r4->{a}[$block_idx]->{c};             # 1
  43. say $r4->{a}->[$block_idx]->{c};           # 1
  44. say $r4->{a}[0]{c};                        # 1
  45. say $$r4{a}[0]{'c'};                       # 1

  46. __DATA__
  47. 1 $$ref[ $idx ]
  48. 2 $$ref{ $name }
  49. 3 $$ref{ $name }{"index"}
  50. 4 $$ref{"block"}[ $block_idx ]{"name"}
复制代码

论坛徽章:
0
4 [报告]
发表于 2015-04-19 15:27 |只看该作者
本帖最后由 bandaotidejia 于 2015-04-19 16:04 编辑

多谢ls,2楼说这样写不安全,请问是这样吗?

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
5 [报告]
发表于 2015-04-19 18:09 |只看该作者
回复 4# bandaotidejia

你如果有 Rubyish 的功力,可以随便用这些花里胡哨的特性。到时候把自己玩进去了别怨我。

几乎所有对变量名的动态命名,都可以用散列来模拟相同的算法。为了将来的你能快速适应自己的代码,还是别用这种不宣而战,肆意糟蹋别人领地的做法。
   

论坛徽章:
0
6 [报告]
发表于 2015-04-19 19:00 |只看该作者
多谢提醒,我现在维护别人写的代码,里面用到了这样的方法,是否全部擦掉重写?这些代码运行过很久,没出过问题

论坛徽章:
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
7 [报告]
发表于 2015-04-19 21:16 |只看该作者
回复 2# 104359176


    普通的引用和符号引用都可以这么写,正常的代码都有 use strict; 已经禁止符号引用了。

    楼主给的代码用了复杂的数据结构不可能犯你说的错误,用变量的名字来构建数据结构的都只是一层,因为不会用引用。

    楼主贴的代码是正确的,不用删改

论坛徽章:
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
8 [报告]
发表于 2015-04-19 21:21 |只看该作者
rubyish 的代码也是正确的,就是一组练习题,了解了解引用的语法就不会用错

论坛徽章:
0
9 [报告]
发表于 2015-04-20 10:05 |只看该作者
             非常感谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP