免费注册 查看新帖 |

Chinaunix

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

perl中的 " -> " 这个符号,主要用作什么 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-08-08 09:17 |只看该作者 |倒序浏览
perl中的  " -> " 这个符号,主要用作什么,有没有资料介绍一下?谢谢了。

[ 本帖最后由 flw 于 2007-8-8 09:41 编辑 ]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2007-08-08 09:40 |只看该作者
-> 有两种用法,都和解引用有关。



第一种用法,就是解引用。
根据 -> 后面跟的符号的不同,解不同类型的引用,
->[] 表示解数组引用,->{} 表示解散列引用,->() 表示解子程序引用。
例子:
$arr_ref = \@array;
$arr_ref->[0] 访问数组 @array 的第一个元素。
$hash_ref = \%hash;
$hash_ref->{foo} 访问 %hash 的 foo 分量
$sub_ref = \&test;
$sub_ref->(1, 2, 3) 使用参数列表 (1,2,3) 来调用 &test 这个子程序。

第二种用法,就是调用类或者对象的方法。
格式:
$obj->method();
或者
ClassName->method();
例如:
$pop3->login( $username, $password );
my $ftp = Net::FTP->new("some.host.name", Debug => 0);
这两种用法略有不同,
但是总的来说,符合以下规则:
假设 -> 的左操作数(就是左边那个值,如 $pop3 和 Net::FTP)是 $left,右操作数(就是右边那个值,如 login 和 new)是 $right,那么 -> 的运算规则就是:

  1. if ( ref $left 有效 ){    # 也就是说 $left 是个引用,而不是个裸字
  2.     $ClassName = ref $left;  # 取引用的类型,当作类名称
  3. }
  4. else{
  5.     $ClassName = $left;       # 直接把裸字当作类名称
  6. }
复制代码


然后调用:
&{$ClassName::$right}( $left, 原参数列表 )
也就是说把类名称和右操作数拼在一起,当作子程序名称(注),并把左操作数当作第一个参数。

注:Perl 解释器要做的工作其实要比这复杂,它还要考虑到继承的问题。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2007-08-08 09:45 |只看该作者
另:发帖时尽量让你的帖子标题更加有意义一些。
至于为什么这么做请参考《提问的智慧》

通常来说把帖子正文的第一句话复制上去都要比你写“请教一个问题”要好得多。

论坛徽章:
0
4 [报告]
发表于 2007-08-09 18:39 |只看该作者
原来子过程引用是这样传参的,受教了~

论坛徽章:
0
5 [报告]
发表于 2007-08-09 20:30 |只看该作者
学了。

论坛徽章:
0
6 [报告]
发表于 2007-08-09 23:45 |只看该作者
PS:那种提问方法适用于利用观者的好奇心,达到吸引人的目的

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2007-08-10 00:39 |只看该作者
原帖由 hfmouse 于 2007-8-9 23:45 发表
PS:那种提问方法适用于利用观者的好奇心,达到吸引人的目的

但是高手可能会因此而不回答那个问题——没几个高手喜欢重复回答简单的问题,他们更加希望每个回复能够被后面的人搜索到,而一个标题不明的帖子基本上是一次性的,试问你会去翻看一个数年前有人发的名为“请教一个问题”的帖子吗?
既然这次答了,下次还有人会问,那还不如不答。

论坛徽章:
0
8 [报告]
发表于 2007-08-13 14:17 |只看该作者
太感谢了~~~谢谢你的回答。。。我好好学习一下。先。

论坛徽章:
0
9 [报告]
发表于 2007-08-23 14:06 |只看该作者

  1. $template=Bugzilla->template;
  2.      ……  
  3. $template->process("bug/navigate.html.tmpl", $vars)
  4.   | | ThrowTemplateError($template->error());
复制代码

是不是可以理解为调用Bugzilla::template::process这个子程序,然后把它自身还有后面两个参数一起传给这个子程序

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
10 [报告]
发表于 2007-08-23 14:17 |只看该作者
原帖由 Piggest 于 2007-8-23 14:06 发表

$template=Bugzilla->template;
     ……  
$template->process("bug/navigate.html.tmpl", $vars)
  | | ThrowTemplateError($template->error());
是不是可以理解为调用Bugzilla::template::process ...

你按我的思路走一遍,
就知道你这个说法对不对了。
如果走了一遍,
还不知道对不对,
那就把你走的过程写下来,
让大家看看。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP