免费注册 查看新帖 |

Chinaunix

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

STDOUT->method()的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-08-27 16:38 |只看该作者 |倒序浏览
本帖最后由 sjdy521 于 2012-08-27 16:38 编辑

发现一个现象:
use IO::Handle之后,类似STDOUT、STDERR之类的句柄就可以继承IO::Handle,用oo的形式使用,比如:
STDOUT->autoflush(1);
我看了一下IO::Handle以及其他一些相关联的模块的源代码,并没有发现什么代码产生了这种效果。
我的疑问是,perlobj里有提到:
When you call a method, the thing on the left side of the arrow is passed as the first argument to the method. That means when we call Critter->new() , the new() method receives the string "Critter" as its first argument. When we call $fred->speak() , the $fred variable is passed as the first argument to speak() .

按照这样的理解,那么STDOUT->autoflush(1)就相当于是STDOUT::autoflush(STDOUT,1);
但显然事实上不是这样的。
想了解下,具体是哪里的代码产生这种效果,还是说,perl内部针对文件句柄做了特殊的处理?

论坛徽章:
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
2 [报告]
发表于 2012-08-27 17:19 来自手机 |只看该作者
特殊处理

论坛徽章:
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
3 [报告]
发表于 2012-08-27 17:24 |只看该作者
回复 1# sjdy521

File handle 在 Perl 内很早之前就是用面向对象的方式实现的,像
  1. print $fh something
复制代码
的代码底层一直都是面向对象的,所以
  1. $fh$
复制代码
之后才不能加逗号的。甚至新版的 Perl,不加载 IO 相关的模块也可以在 File handle 上调用方法,参看 http://search.cpan.org/~jesse/pe ... _IO::File_on_demand
至于
  1. STDOUT->autoflush(1)
复制代码
肯定是不能理解为
  1. STDOUT::autoflush(STDOUT,1);
复制代码
的,它调用的是
  1. IO::Handle
复制代码
或者
  1. IO::File
复制代码
里的方法。你可以理解为
  1. STDOUT
复制代码
是一个对象而不是一串简单的字符串,仅仅是它前面不含 sigil 而已,但是它仍然是一个变量。

论坛徽章:
0
4 [报告]
发表于 2012-08-27 17:31 |只看该作者
本帖最后由 sjdy521 于 2012-08-27 17:33 编辑

@zhlong8@Monox
这样感觉有点蛋疼啊。可能我肤浅了
比如:
  1. perl -e 'package AA;sub func{print "hello world\n";}package main;open(AA);AA->func()'
复制代码
如果一个包的名称和一个句柄重复了,就没办法正常方式使用了
  1. Can't locate object method "func" via package "IO::Handle" at -e line 1.
复制代码
甚至我
  1. "AA"->func()
复制代码
  1. AA::->func()
复制代码
都不可以

论坛徽章:
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
5 [报告]
发表于 2012-08-27 17:35 |只看该作者
回复 4# sjdy521


    现在都建议用 Perl 的三参数 open 写法,文件句柄用局部变量的形式。因为使用全局变量有太多的不好的地方。

论坛徽章:
0
6 [报告]
发表于 2012-08-27 17:42 |只看该作者
回复 5# Monox


    好,这些内部原理辨识清楚了以后遇到也不怕了。 我现在也很少会用bareword做文件句柄

论坛徽章:
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
7 [报告]
发表于 2012-08-27 17:43 |只看该作者
回复 6# sjdy521


    不过,话说回来,这样子是可以的
  1. perl -e 'package AA; sub func { print "hello world\n"; } package main; open(AA);package AA;AA->func()'
复制代码

论坛徽章:
0
8 [报告]
发表于 2012-08-27 17:47 |只看该作者
这样子*main::AA和*AA::AA都被隔开了。。不算 不算
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP