Chinaunix

标题: 茴字的多种写法 -- 论神仙代码 [打印本页]

作者: 兰花仙子    时间: 2009-12-01 22:04
标题: 茴字的多种写法 -- 论神仙代码
前几天小马的case:

12
23
34
45
56
67


想变成:

1223
3445
5667


一般大家都会想到:

perl -pe 'chomp if $. % 2' file


这个最直观易懂。



但是Randal(Perl hacker,教育家)给出这个方法:

perl -pe 'chomp; $_ .= <>' file


这个实现得更巧妙(偶已解释过),且没有取余运算,效率会更高。



后来John W.(another Perl hacker)秀了一个更smart的方法:

perl -lpe '$\=--$|?$,:$/' file


代码写到这样就是神仙了~~ 反正偶一时半会没看明白~~

我也读过大小骆驼呀、高级编程啥的也读过一堆呀,怎么就想不到呢?

达到这一级,除了经验外,更多的是靠冰雪玲珑心了~~

    --对,一定要有一颗玲珑的慧心~~

看看“Just another Perl hacker”有多少种写法就知道了。


神仙的代码一般人是看不懂的,好在有懂的人出来点拨:

--$|   toggles between 1 and 0. It is this variable's behavior when (--$| or $|--)
       $| is initially 0. (NOTE: this behavior doesn't happen with ++$| or $|++).

-l      chomps the line input and, for when --$| == 1, prints with $\ = $,
      ($, is by default the empty string). When --$| == 0, prints with $\ = $/
       ($/ is by default = "\n").
-p     applies 'print()' as the last statement in the implicit 'while( ... )'  loop

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")




这就是Perl的魅力!聪者自聪,愚者自愚,Perl还是Perl~~

[ 本帖最后由 兰花仙子 于 2009-12-1 22:09 编辑 ]
作者: tommydu    时间: 2009-12-01 22:12
强~
作者: agen_0502    时间: 2009-12-01 23:00
和您天壤之别呀
作者: churchmice    时间: 2009-12-01 23:07
不错
长见识了
不过估计过一个月我也不知道自己写的是啥了
作者: wfnh    时间: 2009-12-01 23:26
强大啊····但是···代码能读懂就好了···反正是要给别人看的·
作者: firefoxmmx    时间: 2009-12-01 23:52
长见识了。
作者: ttcn_cu    时间: 2009-12-02 13:57
perl -lpe '$\=--$|?$,/' file


谁要是在我的组里用这种代码,我一定用刀劈他
作者: flw    时间: 2009-12-02 14:01
原帖由 ttcn_cu 于 2009-12-2 13:57 发表


谁要是在我的组里用这种代码,我一定用刀劈他

re
作者: DQP    时间: 2009-12-02 14:29
原帖由 ttcn_cu 于 2009-12-2 13:57 发表


谁要是在我的组里用这种代码,我一定用刀劈他


这种代码多半是用过一次就扔了的。
给自己增加点乐趣也没什么不好。
作者: hitsubunnu    时间: 2009-12-02 15:52
小马 是谁?
作者: ttcn_cu    时间: 2009-12-02 18:10
标题: 回复 #9 DQP 的帖子
要是在自己的终端上写,那爱咋写咋写.若是要是checkin的,那就要拎出去了,作者罚抄100遍code guideline.

反过来想,你要是写了奇怪的代码,人家看了注释都不懂,整天来问你,不是烦死了.
作者: freearth    时间: 2009-12-02 19:24
标题: 回复 #1 兰花仙子 的帖子
突然想起来一句话:
“代码是写给人看的,只是顺便让机器执行一下”。
作者: 兰花仙子    时间: 2009-12-02 20:02
标题: 回复 #12 freearth 的帖子
其实绝大多数人包括Hacker都是正正规规写代码的,例如我认识的2个Peter Scott(写过几本书)和Jenda(Mail::Sender和PSH的作者),其coding套路都相当清楚。还有Tom Phoenix,我曾有幸聆听其教诲,很让人尊敬(可以去CPAN拜读其模块)。
但是对Randal L. Schwartz、John W. Krahn这样的人,人们也照样尊敬他们。他们让Perl世界更有乐趣。
John N年如一日的在邮件列表上回答问题,给初学者指点迷津,让方向错者迷途知返,赢得了list上无数人的尊敬(including me)。在Perl beginners world,他们是导师,是殿堂级的人。如果在Cornell,他们可以进入Dagger & Quill。
作者: blackold    时间: 2009-12-02 20:40
原帖由 ttcn_cu 于 2009-12-2 13:57 发表


谁要是在我的组里用这种代码,我一定用刀劈他


作者: DQP    时间: 2009-12-02 21:28
有些语言看上去就像为代码一样, 不管阅读者会不会这门语言都可以读懂。
perl不一样, 它就是为perler准备的。 没有必要把perl写得让所有的人都能读明白。只要思路清晰直观就好了。
像下面这个代码 它就很直观简洁。
perl -pe 'chomp; $_ .= <>' file


另外一段就不一样了. 我认为作者是故意使用了$, $/来增加阅读难度, 完全可以直接写成 "" 和 “\n"。  所以这段代码是完全用来娱乐的。
perl -lpe '$\=--$|?$,/' file

作者: 兰花仙子    时间: 2009-12-02 21:58
**** 本内容跟帖回复才可浏览 *****
作者: cobrawgl    时间: 2009-12-02 22:04
这种代码不会写也罢!


作者: ttcn_cu    时间: 2009-12-02 22:06
C也有娱乐,但多出现在万恶的面试(宝典)里出现,Programmer想娱乐起来那就没底线了。

恰好今天参加一个会,一个老板就问了这样一个问题。代码交给一个新手来看是否会有问题,他/她能不能独立去修改。可见还是有很多role关心代码的可读性问题的。

高级的地方偶尔出现一次有画龙点睛的效果,如果处处都是,就会惹人嫌了。
作者: blackold    时间: 2009-12-02 22:08
标题: 回复 #18 ttcn_cu 的帖子
见一次劈一次。
作者: blackold    时间: 2009-12-02 22:10
标题: 回复 #16 兰花仙子 的帖子
Orchid, 你不是让我灌水吗?
作者: DQP    时间: 2009-12-02 22:11
标题: 回复 #16 兰花仙子 的帖子
受骗了。。。。。
作者: ttcn_cu    时间: 2009-12-02 22:21
Orchid, 你不是让我灌水吗?
作者: jiannma    时间: 2009-12-02 23:05
仙子姐姐  终于看到了什么叫高手阿  。。。

“路慢慢其修远兮,吾将上下而求索”。。。。
作者: jiannma    时间: 2009-12-02 23:06
标题: 回复 #16 兰花仙子 的帖子

作者: jiannma    时间: 2009-12-02 23:14
标题: 回复 #10 hitsubunnu 的帖子
就是在下咯
作者: linkejin    时间: 2009-12-03 09:44
标题: 回复 #1 兰花仙子 的帖子
听说花仙子出来授课了,哪边可以下资料啊?
我没接触过perl,对bash,Makefile只有一点点基础了解,高级用法就不怎么用过。
花仙子能把我这个perl小白教成高手,就能体现你的水平了,以后我唯花仙子是瞻,哈哈!!!
作者: ly5066113    时间: 2009-12-03 10:38

作者: wind_ch    时间: 2009-12-03 11:20
灌水看隱藏.
作者: wind_ch    时间: 2009-12-03 11:27
原帖由 兰花仙子 于 2009-12-2 21:58 发表
**** 本内容跟帖回复才可浏览 *****


作者: coneagoe    时间: 2009-12-03 12:34
不敢说自己懂perl。
作者: to407    时间: 2009-12-03 15:06
标题: 回复 #1 兰花仙子 的帖子
我就看看。。。。很崇拜。。。
作者: main_dir    时间: 2009-12-03 16:49
:wink:
作者: vabc3    时间: 2009-12-03 17:01
larry原来参加c复杂语句大赛拿过第一    现在应该搞个perl复杂度大赛阿--
作者: dormousechina    时间: 2009-12-03 17:25
标题: 回复 #16 兰花仙子 的帖子

作者: tpro    时间: 2009-12-03 21:54
厉害
作者: naihe2010    时间: 2009-12-04 09:34
牛人!
作者: bigbombgj    时间: 2009-12-04 16:21
标题:

作者: lbaby    时间: 2009-12-04 20:10
呃,这就是为啥俺不喜欢 perl 的原因
作者: lbaby    时间: 2009-12-05 16:28
原帖由 vabc3 于 2009-12-3 17:01 发表
larry原来参加c复杂语句大赛拿过第一    现在应该搞个perl复杂度大赛阿--

larry 最喜欢说双关语
作者: beyondfly    时间: 2009-12-06 10:09
太难懂了
作者: 山野村夫    时间: 2009-12-06 17:57
好复杂
作者: solobaba    时间: 2009-12-07 13:17

作者: YellowSwan    时间: 2009-12-08 22:40
原帖由 兰花仙子 于 2009-12-1 22:04 发表

perl -lpe '$\=--$|?$,/' file


嗯,这样写的话,要加100行注释,而且还是中文注释
估计英文注释别人就更看不懂了
作者: saekil    时间: 2009-12-09 10:51
果然是大虾级别的。。
作者: dahe_1984    时间: 2009-12-09 11:31
整这些没用的,
作者: blackold    时间: 2009-12-09 11:37
凝练!

像古文古诗,喜欢!
作者: Tim_tsang    时间: 2009-12-10 17:10
标题: 回复 #47 blackold 的帖子
you fen ?
作者: ldw21cn    时间: 2009-12-11 17:01
标题: 回复 #1 兰花仙子 的帖子
perl -pe 'chomp if $. % 2' file

请教下仙子,这个  $.   是啥意思?

[ 本帖最后由 ldw21cn 于 2009-12-11 17:03 编辑 ]
作者: 兰花仙子    时间: 2009-12-11 17:52
标题: 回复 #49 ldw21cn 的帖子
line number, see perldoc perlvar.
作者: ldw21cn    时间: 2009-12-11 18:00
标题: 回复 #50 兰花仙子 的帖子
谢谢仙子,明白了!
作者: hanyanjunbj    时间: 2010-09-06 14:17
呵呵,有趣,学习了
作者: minirain    时间: 2010-09-07 07:46
dvvvsvsvdvsav
作者: minirain    时间: 2010-09-07 07:47
回复 16# 兰花仙子


    哈哈
作者: heqidz    时间: 2010-09-07 09:37
提示: 作者被禁止或删除 内容自动屏蔽
作者: imonkey    时间: 2010-09-08 13:29
回复一下 看看帖子   perl的奇特用法太多了
作者: cinanine    时间: 2010-12-16 10:01

作者: ggglw    时间: 2010-12-16 10:52
看看
作者: liyangole    时间: 2010-12-16 12:00
顶了。
作者: 2gua    时间: 2010-12-16 12:31
Perl高手,总是牛人。
作者: kingwmj    时间: 2010-12-16 16:51
学习了。。。。
作者: Sofiaming    时间: 2010-12-17 11:33
这个肯定是娱乐代码,但能想到这样写确实是神仙了
作者: kidaaaa    时间: 2011-01-02 20:03
非常NB的思路,真是长见识了
作者: brainwang198206    时间: 2011-04-26 17:35
回复 1# 兰花仙子

敬礼!




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