免费注册 查看新帖 |

Chinaunix

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

Perl句柄引用的疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-05-25 08:44 |只看该作者 |倒序浏览
  1. splutter(\*STDOUT);

  2. sub splutter {
  3.         my $fh = shift;
  4.         print $fh = "her um well a hmmm\n";
  5. }
复制代码
print $fh = "her um well a hmmm\n"; 中的 “=” 的作用,有与没有个结果都一样,如果文件句柄不是\*STDOUT 而是一个真正的文件的句柄,会怎么样呢?

请赐教。

论坛徽章:
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-05-25 09:05 |只看该作者
你这里相当于 print ($fh = "her un well a hmmm\n"); 只是个优先级问题

论坛徽章:
0
3 [报告]
发表于 2012-05-25 10:44 |只看该作者
zhlong8 发表于 2012-05-25 09:05
你这里相当于 print ($fh = "her un well a hmmm\n"); 只是个优先级问题


$fh就是一个文件句柄引用,为何要赋值呢?并且我试过要不要“=”,结果都是一样。我的关注点不是优先级问题,是为何有这个“=”号。

论坛徽章:
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
4 [报告]
发表于 2012-05-25 10:58 |只看该作者
on-fire 发表于 2012-05-25 10:44
$fh就是一个文件句柄引用,为何要赋值呢?并且我试过要不要“=”,结果都是一样。我的关注点不是优先级 ...


我把这个代码 Perl 解释器是怎么理解的给你写出来你不就明白了为什么有没有 '=' 效果一样。

你明白了为什么结果一样不就很直接的发现这里是 typo,只要传入的句柄不是 STDOUT STDERR 就立马露馅了

论坛徽章:
0
5 [报告]
发表于 2012-05-25 11:33 |只看该作者
zhlong8 发表于 2012-05-25 10:58
我把这个代码 Perl 解释器是怎么理解的给你写出来你不就明白了为什么有没有 '=' 效果一样。

你明白了 ...


感觉应该不是typo(打字排版错误),如果$fh 不是STDOUT或STDERR,而是一个真正的文件句柄,是否真的需要赋值给它呢?纠结中。。。
问题是以我现在的知识水平写不出验证的例子。

论坛徽章:
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
6 [报告]
发表于 2012-05-25 12:19 |只看该作者
on-fire 发表于 2012-05-25 11:33
感觉应该不是typo(打字排版错误),如果$fh 不是STDOUT或STDERR,而是一个真正的文件句柄,是否真的需要 ...


你对 Perl 的文件句柄怨念很深啊

由于历史原因文件句柄在只能保存在 Typeglob 里面的,所以任何可以当句柄用的东西除了 tie 实现的假的句柄外都是对 typeglob 的封闭。

typeglob
    比如 open *STDOUT, '<', 'file';
    print {*STDOUT} 'testing';

bareword
    比如 print FH 'something';
    在编译时会转成对应的 typeglob *FH

scalar
   比如 open $fh, '<', 'file'
   在运行时会创建一个匿名的 typeglob,然后 $fh 是这个 typeglob 的引用,关于句柄的所有操作对 typeglob 的引用都会自动解引用

而 tie filehandle 等于重载了 IO 相关的操作,和这里的议题无关。

论坛徽章:
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 [报告]
发表于 2012-05-25 12:34 |只看该作者
查了下还可以用字符串,意义同 bareword 只是改成了运行时。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2012-05-25 12:36 |只看该作者
这个问题很简单呀。第一个回帖就已经说的很清楚了。

楼主说有没有等号是一个效果,但其实不是一个效果。
有等号的时候,是 print 这个字符串(赋值语句的结果)到当前选中(select)的文件句柄上去。
没等号的时候,是 print 这个字符串到 $fh 这个表达式指名的文件句柄上去。

论坛徽章:
0
9 [报告]
发表于 2012-05-25 20:42 |只看该作者
zhlong8 发表于 2012-05-25 12:19
你对 Perl 的文件句柄怨念很深啊

由于历史原因文件句柄在只能保存在 Typeglob 里面的,所以任何可以 ...


谢谢您花时间查资料并回复我。获益了,看来要好好研究一下Typeglob(类型团)这个概念。

论坛徽章:
0
10 [报告]
发表于 2012-05-25 20:43 |只看该作者
flw 发表于 2012-05-25 12:36
这个问题很简单呀。第一个回帖就已经说的很清楚了。

楼主说有没有等号是一个效果,但其实不是一个效果。 ...


最初的想法与您一致,但觉得没有必要放个“=” 所以问问,获益领教了。谢谢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP