python是一个很cool的脚本编程语言,perl很有用但是用起来很痛苦。对于几乎所有的任务,python有充足的理由是第一选择,尤其是对那些不熟悉perl或者python的C/C++程序猿们。对那些了解perl的C/C++程序员来说,python也堪称一个更好的选择
WHY?!
看了以下例子你就明白:
例子1:读取整个文件
perl
my $text = do { local( @ARGV, $/ ) = $file ; <> } ;
我看了半天是没看懂啥意思,ARGV在这里是干嘛的,来看看我找的其他例子
local( *FH ) ;
open( FH, $file ) or die "Problem\n"
my $text = do { local( $/ ) ; } ;
另外一个
my $holdTerminator = $/;
undef $/;
my $buf = ;
$/ = $holdTerminator;
我该说什么了,perl你不尴尬嘛
python
]fileContents = file("filename").read()
例子2:定义一个func函数,返回int值,第四个参数默认值为0
C++
[
int func(int parm1, int parm2, int parm3, int parm4 = 0);
perl
sub func
{
my $parm1 = shift;
my $parm2 = shift;
my $parm3 = shift;
die "Usage: func(parm1, parm2, parm3, parm4 = 0)"
unless defined($parm3);
my $parm4 = shift || 0;
...
}
看着是不是怪怪的,即使你会用perl。用如此笨拙的代码来实现这么简单的东西。die用来处理参数,
perl不担心你是否没有传入参数或者传了10个以上的参数。perl中函数中的变量默认是全局的,需要用my设置为局部变量。
要知道大部分c/c++ 程序猿可不习惯这个
python
def func(parm1, parm2, parm3, parm4 = 0): ... python会自己处理参数个数,并且设置参数默认值,而且函数里默认的值是局部变量哦
例子3:打印当前的进程名,并跟随一个换行符
C++
cout < < argv[0] << ‘\n’;
perl
print "$0\n"; 看着挺顺眼的是不,$0是进程的名字。或许你会尝试用$ARGV[0]代替$[0],要知道C++里我是能用ARGV[0]表示进程名的,但是结果却不是你要的 perl中ARGV仅仅包含要处理的参数,而不包括进程名(译者说,实际上shell一般默认$0也是进程名的
python
print sys.argv[0] #好吧,让你比较困惑的是还要加一个sys
例子4:文件迭代,代开一个in.txt文件,对每行进行迭代操作
C++
ifstream infile("in.txt");
const int MAX_LINE_LEN = 256;
char line[MAX_LINE_LEN];
while(infile.getline(line, MAX_LINE_LEN))
{
... do something with line
}
//要创建一个buffer来存放每一行
perl
open(INFILE, "in.txt") || die 'Couldn't open "in.txt"';
while()
{
... do something with $_
}
open看起来挺好的。。加了个die代码之后变得丑了
Python
infile = open("in.txt")
for line in infile:
... do something with line
好简洁吧
例子5:检查字符串的开头是否以'H'开始,假设这个字符串是从文件迭代中获得的
C++
if(line[0] == 'H')
{
...
perl
if(substr($_, 0, 1) eq 'H')
{
...
perl中没有字符串操作符,你要调用substr函数,而且等于是eq而不是==
python
if line[0] == 'H':
...
c++程序猿更习惯这个吧
或者
if line.startswith('H'):
例子6:将一个列表传入函数中,使其能够在函数中修改它,而不是得到列表的拷贝
C++
void addItem(vector<string>& theList)
{
theList.push_back("xyz");
}
vector<string> aList;
aList.push_back("abc");
addItem(aList);
这是通过C++中的引用传值进行的
Perl
sub addItem
{
my $listRef = shift;
push(@$listRef, 'xyz');
}
my @aList = ('abc');
addItem(\@aList);
这里用到了很多Perl特有的特点,用\表示alist是通过引用传值的等等。其实比较复杂
Python
def addItem(theList):
theList.append('xyz')
aList = ['abc']
addItem(aList)
python中一切是通过引用传递的
还有以下例子:
Array and string length
Print a list that belongs to a hash
Trim whitespace from a string
Classes
Inheritance
Magic
Exceptions
Assert
Code Maintenance
来看看各路大神怎么推崇Python的吧
"Perl? Ha, ha, ha. Try Python" O'Reilly ad.
Bruce Eckel talks about Python当你发现Python的高效时,你会觉得我为什么要把生命中的其他时间浪费在其他语言上
Why Hate Perl 为神马讨厌Perl
Why I Promote Python
来看看Eric Raymond的意见Eric Raymond's "Why Python?"
原文在此:here
发表在《
发表在《
发表在《
来看看
[回复]
perl易写不易读啊
[回复]
perl是很艺术的语言,非常灵活。
倡导的是不只一种方法能达到目的。
这才叫酷!
而不像py一样,同一个东西,10个人写出来,几乎9份都一样。
[回复]
freetstar
回复:
六月 30th, 2011 at 10:07 下午
这就是语言各自的特点吧。希望此文章别成为口水文,,
[回复]
看完这篇文章之后,我觉得可以忽略ESR当年说的“最好五种都会”的言论了……
[回复]
freetstar
回复:
六月 17th, 2011 at 4:22 下午
玩转python,be pythonic…
[回复]
perl读取文件,这样其实也挺简洁了:
open(my $in, “<", "filename");
@lines = ;
open(INFILE, “in.txt”) || die ‘Couldn’t open “in.txt”‘;
… …
open看起来挺好的。。加了个die代码之后变得丑了 <– 这句不太同意,perl可以在一行内搞定检错,其他还得try吧
[回复]
vvoody
回复:
五月 10th, 2011 at 4:08 上午
@vvoody, 汗,@line=后面怎么被吃掉了,@line = <$in>
[回复]
freetstar
回复:
五月 10th, 2011 at 11:05 上午
我觉得可能是原作者不熟悉perl
[回复]
注释 注意代码注释。。。看见注释不对就浑身难受….
[回复]
freetstar
回复:
五月 8th, 2011 at 3:13 下午
@OSMSG, 恩,写的懒得改了
[回复]
python是效率,C/C++是细节
[回复]
freetstar
回复:
五月 8th, 2011 at 3:15 下午
@Mucid, python开发效率高,底层效率不知道怎么样
[回复]
依然用文件指针的飘过……
[回复]
淡定如果,没几个看得懂
[回复]
freetstar
回复:
五月 8th, 2011 at 3:14 下午
@婉秋, 淡定
[回复]
这样子不好吧?你不是在公然挑起各语言派别之间的口水战么?
By the way:以第一个例子“读取整个文件”来说,真正优美的Perl程序并不是这么写的。
[回复]
freetstar
回复:
五月 8th, 2011 at 3:14 下午
@Tao Zhu, 翻译过来的,就是想看看大家有啥看法,Perl我一点没接触过,哈哈
[回复]
Tao Zhu
回复:
五月 8th, 2011 at 3:30 下午
@freetstar, 好吧,估计是python的水军
[回复]
freetstar
回复:
五月 8th, 2011 at 3:34 下午
@Tao Zhu, ╮(╯▽╰)╭,windows没linux折腾起来好玩,这几天毕业设计该死的论文必须要用word
[回复]
Tao Zhu
回复:
五月 8th, 2011 at 3:37 下午
@freetstar, 那就果断vbox虚拟XP+word呗!也算是为vbox做点贡献
[回复]
freetstar
回复:
五月 8th, 2011 at 3:40 下午
@Tao Zhu, 没找到合适的xp镜像= =
[回复]
Tao Zhu
回复:
五月 8th, 2011 at 3:43 下午
@freetstar, 我有一个很标准的600M的XP镜像,可是不知道怎么给你呢?不知道有什么好一点的网络途径
[回复]
freetstar
回复:
五月 8th, 2011 at 4:25 下午
@Tao Zhu, 多谢,不折腾了,直接用win顶几天万事了.可能是我的vb版本太低,装完xp都黑屏了
[回复]