Chinaunix

标题: perl中的 " -> " 这个符号,主要用作什么 [打印本页]

作者: lx-tmac    时间: 2007-08-08 09:17
标题: perl中的 " -> " 这个符号,主要用作什么
perl中的  " -> " 这个符号,主要用作什么,有没有资料介绍一下?谢谢了。

[ 本帖最后由 flw 于 2007-8-8 09:41 编辑 ]
作者: flw    时间: 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 解释器要做的工作其实要比这复杂,它还要考虑到继承的问题。

作者: flw    时间: 2007-08-08 09:45
另:发帖时尽量让你的帖子标题更加有意义一些。
至于为什么这么做请参考《提问的智慧》

通常来说把帖子正文的第一句话复制上去都要比你写“请教一个问题”要好得多。
作者: socyno    时间: 2007-08-09 18:39
原来子过程引用是这样传参的,受教了~
作者: 2gua    时间: 2007-08-09 20:30
学了。

作者: hfmouse    时间: 2007-08-09 23:45
PS:那种提问方法适用于利用观者的好奇心,达到吸引人的目的
作者: flw    时间: 2007-08-10 00:39
原帖由 hfmouse 于 2007-8-9 23:45 发表
PS:那种提问方法适用于利用观者的好奇心,达到吸引人的目的

但是高手可能会因此而不回答那个问题——没几个高手喜欢重复回答简单的问题,他们更加希望每个回复能够被后面的人搜索到,而一个标题不明的帖子基本上是一次性的,试问你会去翻看一个数年前有人发的名为“请教一个问题”的帖子吗?
既然这次答了,下次还有人会问,那还不如不答。
作者: lx-tmac    时间: 2007-08-13 14:17
太感谢了~~~谢谢你的回答。。。我好好学习一下。先。
作者: Piggest    时间: 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这个子程序,然后把它自身还有后面两个参数一起传给这个子程序
作者: flw    时间: 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 ...

你按我的思路走一遍,
就知道你这个说法对不对了。
如果走了一遍,
还不知道对不对,
那就把你走的过程写下来,
让大家看看。
作者: Piggest    时间: 2007-08-23 14:51
$template=Bugzilla->template这算是定义了,后面在出现就是引用
然后类别名应该是&Bugzilla::template::process($template,"bug/navigate.html.tmpl", $vars");
这样应该对了吧
我是刚开始学perl,由于工作需要要修改Bugzilla的邮件系统,希望通过飞鸽来发送通知,对我来说很困难
上面那段代码是post_bug.cgi中的代码,我想通过关闭bugzilla的邮件功能,然后在这post_bug.cgi中加一个system来调用一个外部程序来实现,不过现在还只是能echo,其他我不会调用
作者: flw    时间: 2007-08-23 15:00
你不肯按照我的思路做,
那我便不肯帮你了哦。
作者: Piggest    时间: 2007-08-23 15:09
不是不肯,是我真的不太懂,我上网查查,再来问吧,谢谢

[ 本帖最后由 Piggest 于 2007-8-23 15:18 编辑 ]
作者: guijia8427    时间: 2008-07-22 18:10
怪哉 为啥
$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 这个子程序。

为啥都要加个反斜杠才行呢 没有反斜杠就引用不了 怎么在perl入门教程中没有提及这样的语法呢
作者: 2gua    时间: 2008-07-22 18:59
flw是Perl布道者,佩服啊。
作者: converse    时间: 2008-07-22 22:39
原帖由 guijia8427 于 2008-7-22 18:10 发表
怪哉 为啥
$arr_ref = \@array;
$arr_ref->[0] 访问数组 @array 的第一个元素。
$hash_ref = \%hash;
$hash_ref->{foo} 访问 %hash 的 foo 分量
$sub_ref = \&test;
$sub_ref->(1, 2, 3) 使用参数列表 (1 ...


找advanced perl programming看看,小骆驼中没有讲引用的部分.
作者: guijia8427    时间: 2008-07-23 09:32
原帖由 converse 于 2008-7-22 22:39 发表


找advanced perl programming看看,小骆驼中没有讲引用的部分.

3Q 现在先骑小骆驼 慢慢来
作者: forlorngenius    时间: 2008-07-23 09:59
看programming perl算了,什么都逮到详细的叙述。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2