免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: cinanine
打印 上一主题 下一主题

不明白这个Magic Perl Code!  关闭 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2010-12-31 16:23 |只看该作者
{:3_186:}
仙子的帖子有这样一段,是$|变量的特性来的。
--$|   toggles between 1 and 0. It is this variable's behavior when (--$| or $|--)
       $| is initially 0. (NOTE: this behavior doesn't happen with ++$| or $|++).




如果要深究为什么会这样,这个俺可搞不定。这个涉及PERL_MAGIC_sv 的内部实现,要FLW老大来讲才行。
  1. #  mg_type
  2. # (old-style char and macro)  MGVTBL          Type of magic
  3. # --------------------------           ------             -------------
  4. # \0 PERL_MAGIC_sv              vtbl_sv          Special scalar variable
复制代码

论坛徽章:
0
22 [报告]
发表于 2010-12-31 16:24 |只看该作者
回复 20# bernana


    So. in effect, on the first line in, chomps the line. Then, since $|==1 in the first
iteration, prints with a line end equal to $, (by default, the empty string).

In the next line, $| will equal 0, so the print will end with $/ (default value of "\n")

$,      为 print 的输出域分隔符。通常 print
            不经任何修饰就输出它的参数,要 得到更像 awk
            的行为,可以将该变量设置成和 awk 的 OFS 变量一样
            ,以指定域之间打印什么。(助记:当 print
            语句里有“,”时会打印的东西。)

$\      为 print 的输出记录分隔符。通常 print
            简单地原样输出它的参数,不增加
            任何结尾的换行符或其他表征记录结束的字符串。要得到更像 awk
            的行为, 可以将该变量设为同 awk 的 ORS 变量一样,以指定在 print
            的结尾输出 什么。(助记:设置 $\ 而不是在 print
            结尾加“\n”。另外,它长得和 $/ 很像,但却是你从 Perl
            那里拿“回”的东西。) (译注:“回”原文为
            单词“back”,还指代反斜杠“backslash”,起一语双关作用。)

论坛徽章:
0
23 [报告]
发表于 2011-01-01 11:55 |只看该作者
这些东西确实很奇妙,让人有些不可思议的,只有去看看具体的实现才能理解的东西。不过,我倒觉得没有太多必要去研究这些极为特殊的东西,除非你对 perl 的实现很有兴趣或需求,毕竟这些不是属于正常的开发中需要用到的,我想也是正常开发中不愿意看到的,用空还是研究研究常用的基础比较好些。

论坛徽章:
0
24 [报告]
发表于 2011-01-08 09:03 |只看该作者
$| 初始化为 0   
--$|  就变成 1

然后 --$|  又是 0
然后 --$|  又是 1
然后 --$|  又是 0
然后 --$|  又是 1
然后 --$|  又是 0
然后 --$|  又是 1
然后 --$|  又是 0
然后 --$|  又是 1

为什么会这样? 要达到这一级,
除了经验外,更多的是靠冰雪玲珑心了,


神仙的代码一般人是看不懂的,
这就是Perl的魅力!神是神,人是人

有神仙出来点拨点拨:

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
25 [报告]
发表于 2011-01-08 09:20 |只看该作者
这就是个规定。
有这么难想通吗?

论坛徽章:
0
26 [报告]
发表于 2011-01-14 08:06 |只看该作者
这就是个规定。
有这么难想通吗?
flw 发表于 2011-01-08 07:50


这就是Perl的魅力!神是神,人是人

有flw大神出来点拨
    感谢 感谢
请flw大神注明规定的出处 ...注明出处就行了。

    感谢 感谢

论坛徽章:
0
27 [报告]
发表于 2011-01-17 06:28 |只看该作者

有请
flw大神帮忙注明规定的出处,谢谢了

.... 感谢.... 感谢

论坛徽章:
0
28 [报告]
发表于 2011-04-08 05:53 |只看该作者
本帖最后由 cinanine 于 2011-04-08 04:29 编辑

比较有难度的问题,

高人flw 不能够解决。

看看有没有真正的高人能够解决??

求高手解惑!!等待真正的高人给我解惑!!


等待真正的高人!!

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
29 [报告]
发表于 2011-04-08 09:02 |只看该作者
$| 初始化为 0   
--$|  就变成 1

然后 --$|  又是 0
然后 --$|  又是 1
然后 --$|  又是 0
然后 -- ...
cinanine 发表于 2011-01-08 09:03



个人解释: (如有误用,敬请指教)....
$|为特殊变数:只有两种状态(跟C/C++的boolean一样)

$|的两种状态: 用意义解释为True与false
用数值表示为: 1与0
注:若设定非0值,则结果为True ==> 1
参看perldoc perlvar
If set to nonzero, forces a flush right away...

$|初始值 0 (false)
--$|后为 -1, -1为非0值,结果为 True => 1
--$|后为 0
--$|后为 -1, -1为非0值,结果为 True => 1

若为++$|
$|初始值 0 (false)
++$|后为 +1,结果为 True => 1
++$|后为 +2,结果为 True => 还是1
++$|后为 +2,结果为 True => 还是1

所以++$|是无法有达成--$|的效果

以上个人解释,如有错误敬请指教.......

论坛徽章:
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
30 [报告]
发表于 2011-04-08 09:51 |只看该作者
本帖最后由 zhlong8 于 2011-04-08 10:12 编辑

不就是定义了 get 和 set 的 MAGIC 使它表现的像个 bool 变量一样。Perl 默认没有 bool 型变量这里做出这种效果来。可以用 tie 做出类似效果


package T;

use 5.012;

sub TIESCALAR {
    my $value = 0;
    bless \$value, shift;
}

sub FETCH {
    my $self = shift;
    return $$self;
}

sub STORE {
    my($self, $value) = @_;
    $$self = ($value ? 1 : 0);
}

1;
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP