免费注册 查看新帖 |

Chinaunix

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

答shhgs对Perl的质疑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-01-25 10:30 |只看该作者 |倒序浏览
此外,Perl是一个严重不一致的语言,是一个不能举一反三的语言。比如


@a= qw/a b c/;
$a = @a;
$b = qw/a b c/;

我不想听解释,我只想问问不懂Perl的人,你的第一反应是什么,$a 是不是等于 $b。


open LOG, ">>logfile"  || die "Cannot create logfile: $!";
open LOG, ">>logfile"  or die "Cannot create logfile: $!";

这两个语句,意思完全相同,形式上也只有一个符号不一样,于是我的第一反应是,这两个符号是完全等价的。

我的第一反应是,这两个符号是完全等价的,现在我问一下,有多少人会认为,它们是有区别的?




这2个问题偶觉得根本不是问题,shhgs首先你自己就没理解好Perl的基础知识,才会有此疑惑。

(1)对第一个问题,你没有理解array与list的区别,也没有完全正确的理解上下文(例如逗号在标量上下文里的概念),你自己看下这个perlfaq吧:

perldoc -q "what is the difference between a list and an array"


(2)对第二个问题,稍微看下Perl的操作符优先顺序表,就不会有什么疑问了。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2007-01-25 10:43 |只看该作者
仙子你错了,你不了解这个人,他不是不明白,他明白这些个语法,但是他就是胡搅蛮缠。
你这样拿他没治的,而且这小子最擅长的一招就是 FUD。
过一会儿他又该说你删了他很多回复你的质疑的帖子了。
到最后就变成了“兰花仙子不想让我开口说话”类似云云……

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2007-01-25 10:46 |只看该作者
大话西游上有台词说“当你发现你爱上了自己最恨的那个人时,这段感情才是最要命的”,
我想 shhgs 和 Perl 大抵就是这种感情吧!
他整天说 Perl 不好,
就和吵架了的小俩口一个说另一个的坏话一样,
我们作为旁人不好劝,你越劝他,他越来劲,而且指不定人家晚上还偷偷地在一起 XX 呢!
不然他为什么一直用着他最不喜欢的 Perl?
爱恨交织才是最要命的。

论坛徽章:
0
4 [报告]
发表于 2007-01-25 10:50 |只看该作者
两位版主,无论shhgs语气如何,我认为他提出的问题是很有道理的
你们不能站在你们精通perl的角度看perl,而是应该站在一个不熟悉人的角度去看

第一个问题就是=号具有传递性,任何人看了这个都会认为$a == $b
第二个问题就是,为何同样一个逻辑或有两种表达方式。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2007-01-25 11:24 |只看该作者
原帖由 ttvast 于 2007-1-25 10:50 发表
你们不能站在你们精通perl的角度看perl,而是应该站在一个不熟悉人的角度去看

你这个想法非常好。
事实上,我正是这么要求自己的(从一些言语之间,也能看出 Larry Wall 也是这么要求自己的,因为他写的《Programming Perl》第一章最后一节的标题就是 "What You Don't Know Won't Hurt You (Much)" 也就是说,即使是站在一个 Perl 新手的角度,Perl 也能够尽可能地为他所用)

BTW:顺便要求一下,希望您也能够站在一个不熟悉 Python 的人的角度去看。
当然了,你跟我讲的时候可以稍微深奥一些,我乐于和你交流 Python。

原帖由 ttvast 于 2007-1-25 10:50 发表
第一个问题就是=号具有传递性,任何人看了这个都会认为$a == $b
第二个问题就是,为何同样一个逻辑或有两种表达方式。

很好,恕我冒昧说一句,你比 shhgs 有资格接受这个问题的答案,我现在就和你探讨一下,希望你能跟踪到底。
1,不错,等号是具有传递性,数学中便是如此,然而,第一个例子中的 = 号不是等号,而是赋值号——这个我想接触过编程语言的人都明白。
赋值号不是等号,因为是一种动作,因此针对不同的数据类型做赋值这个动作,按照 Python 的“一切皆对象理论”,实际上是调用了不同对象的赋值方法(C++ 中叫“拷贝构造函数”),因此它没有传递性。举个 C 的例子:
unsigned char a;
signed char b;
int x, y;

a = 255;
b = a;
x = a;
y = b;

if ( x == y ){ //测试结果应该如何呢?
    ....
}

2,如同仙子所说,|| 和 or 是两个不同的运算符,它们具有不同的优先级,而了解运算符的优先级是任何一个试图阅读该语言代码的人所应该了解的内容(即使只是为了阅读他人的代码而偶尔接触一下 Perl),同样,举个 C 的例子:
c = 1
d = 2
a, b = c, d
在这里,因为赋值运算的优先级要比逗号运算符高,因此最后一句的作用是实际上是将 c 赋值给了 b,而 a 和 d 的值并没有变。
事有凑巧,这三行代码在 python 中也是合法的,可是 python 中的赋值运算就和 C 的规则不一样,因此 Python 会把最后一句解释成为
c 赋值给 a,d 赋值给 b,那么我作为一个 C 程序员,是否可以理解为 Python 的有些语法规则不符合常规逻辑呢?当然不能这么说!
因为我如果稍微了解一点 Python,就不会犯这种初级错误了。
BTW:Perl 中关于 a, b = c, d 的解释规则和 C 是一样的,因此我作为一个 C 程序员来讲,更容易理解它。虽然不加了解就试图理解也是错误的。

论坛徽章:
0
6 [报告]
发表于 2007-01-25 11:26 |只看该作者
版主太认真了,我不好意思再和你们较真了。

在C里面我决不会用 a,b=c,d这种写法,python里面,我也基本上用 a=c b=d来实现这一个操作。

我的想法可能和你们不大一样,在我看来,多几行字少几行字实在是无关紧要。开发上耗时间绝对不在打字上。 语言特性的东西会给程序的微小局部带来简单,但是不可能影响一个完整功能的实现。 我甚至习惯于大量复制粘贴而不是尽量合并。 的确,设计精良,并且精简的程序,会减少开发中的bug。不过,我所碰到的问题中,由于写程序能力带来的bug消耗的debug时间,远远少于流程设计中出现bug需要修复的时间。

因此在我看来
流程(算法) >> 程序语言 >>  打字
所以我不吝啬打字时间, 尽量把程序写的很死不给语言本身有任何发挥的机会。 要知道,你给程序语言越大的灵活度,意味着你对这种程序语言要有越深的理解。而你越是熟悉一个语言,你越容易被他吸引过去,最后程序语言变成了你的思维哲学,人成了语言的奴隶。

人人学习oo语言,但是OO并不一定要语言支持才能实现,python是完全的OO语言,他的源代码也是OO的设计,不过用的是纯C,没有一点C++的。

总的说起来,我上面的那个式子应该是

业务逻辑 >> 实现方法(流程、算法) >> 程序框架 >> 程序语言 >> 打字

不和版主争论。仅仅是自己对写程序的一种想法而已。

评分

参与人数 1可用积分 +1 收起 理由
flw + 1 我很赞同

查看全部评分

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2007-01-25 11:39 |只看该作者
ttvast 你讲的非常好!
正如你所说:
> 在C里面我决不会用 a,b=c,d这种写法,python里面,我也基本上用 a=c b=d来实现这一个操作。

因此,
1,我在 Perl 中也决不会使用
$b = qw/a b c/;
这种写法。

2,我在 Perl 中也决不会使用
open LOG, ">>logfile"  || die "Cannot create logfile: $!";
这种写法。
而是用
open( LOG, ">>logfile" ) || die "Cannot create logfile: $!";
来代替(如果我一定要用 || 的话)
更多的时候我会用更安全的写法:
open LOG, ">>logfile"  or die "Cannot create logfile: $!";

请问您是否可以认为我已经圆满地回答了你最初的疑问呢?
如果 shhgs 和您一样温和、乐于探讨的话,是否也可以同样回答他的疑问呢?
如果回答不了他的疑问,那么我是否可以认为他就是胡搅蛮缠呢?

BTW:
下面现编一个小品:
A 面对 x y z 等众人,
叫嚣: Perl 就是 @#)%#%*W)$(#*
无人回答……
A 又继续说:我说过 Perl 就是 @#)%#%*W)$(#* 这下你们看到了吗?都没人敢反驳我。
此时 x 忍不住了,上来说 ~~???@#$)@#)$#
结果 x 功力不济,败下阵来,
于是 A 又说:看看!我说的没错吧!不仅 Perl 就是 @#)%#%*W)$(#*,而且 x y z 都认识不到 Perl 就是 @#)%#%*W)$(#*!
旁边 B 插话了:我觉得 A 说的很对!
此时 y 上来了,认真地阐述了一下 Perl 为什么不是 @#)%#%*W)$(#*
然后 B 又说,就说:y 先生你太认真了……
y faint~
再过了一阵子,
A 又开始嚷嚷:谁把我的帖子都删了?我刚才发了 500 个帖子,都不见了,不知道我这个帖子又有几个人能看到~
z 心里说:faint~ 谁没事干删你的帖子?我一直都在忙着上班呢……

论坛徽章:
0
8 [报告]
发表于 2007-01-25 11:56 |只看该作者
你们讲的东西我早就理解,知道是各人的哲学观不一样,或者仅仅是习惯爱好不同而已,所以根本没有必要达成一致意见。

我承认,我是B
你就faint把

[ 本帖最后由 ttvast 于 2007-1-25 11:57 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2007-01-25 12:09 |只看该作者
按照 Python 的“一切皆对象理论”,实际上是调用了不同对象的赋值方法(C++ 中叫“拷贝构造函数”),因此它没有传递性。


python 中的等号和 c++ 并不一样,不是拷贝,只是名字与对象之间绑定的过程,名字就是变量,绑定相当于静态语言中的引用,但是更纯粹些。
所以可以 a = b = obj ,然后 a==b 为真。

另外:
如果 || 和 or 只是优先级不同的话,又何苦存在两个呢。
如果
“我在 Perl 中也决不会使用
$b = qw/a b c/;
这种写法。”
这种写法又何苦存在呢?

我想这是我对 perl、ruby 的哲学无法理解的最关键的地方,我觉得一个事情拥有多种差不多的做法完全没有意义。

论坛徽章:
0
10 [报告]
发表于 2007-01-25 12:23 |只看该作者
原帖由 huangyiiiiii 于 2007-1-25 12:09 发表


如果 || 和 or 只是优先级不同的话,又何苦存在两个呢。


perl的哲学就是There's More Than One Way to Do IT.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP