实时搜索: perl python哪个好

perl python哪个好

729条评论 4338人喜欢 1053次阅读 510人点赞
最近想学习一下 不知道python在哪些优于perl,高手们给点建议 , 将一下两行代码翻译为python。 谢谢!
my $ldom = DateTime->last_day_of_month( year=>$tztime->year, month=>$tztime->month )->day;
splice(@ldom_sanity,2,1,30); , 有一文件,其格式为: 共3列,第1列是方位(north, west...),第2列是坐标,第3列是判定条件(共4个,A,B,C和D),(各列之间以tab隔开,且数据按照sort -k...

python和perl学习哪个好: 学了用了才知道哪个好,先找点入门教程,看你适合学哪个来这里当然推荐你学Python,当然Perl也不错。 查看原帖>>

请问如何在python中调用perl脚本?: 1.确保perl已经安装并且在PATH中。
2.in python:
import subprocess
subprocess.call(["perl", "/path/to/your-script.pl"])

如果脚本本身有可执行权限,直接这样也行:
import subprocess
subprocess.call(["/path/to/your-script.pl"])

perl 翻译为 python: 1. Perl 中的标量
a. Perl 中的标量在Python 中对应为数字类型和字符串类型
Perl 的标量是字符串还是数值会根据上下文自动判断,但是Python 不会这样做。
下面的代码是你在Perl 中习以为常的操作
[plain] view plaincopy在CODE上查看代码片派生到我的代码片
my ($string, $number) = ("1", );
$number = $string + "1"; # $string 和"1" 都被解释为数值
say $number;
$string = $number.1; # $number 和1 都被解释为字符串
say $string;

但是Python 中你必须显式的指定数据类型
[python] view plaincopy在CODE上查看代码片派生到我的代码片string = "1" number = int (string) + 1 # 必须显式转换为数值类型
print (number)
string = str (number) + "1" # 同样必须显式转换为字符串
print (string)

b. Perl 的标量不支持下标运算,但是Python 的字符串可以
Python 中你可以很方便的用下标索引字符串(而且和Perl 中的列表一样也支持用负数做反向索引)
[python] view plaincopy在CODE上查看代码片派生到我的代码片
s = "A string" print (s[2:])
但是Perl 的标量就无法这样操作,相同的操作必须用列表切片完成

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
$_ = "A string";
say ((split //)[2..split //]);
c. Perl 中的heredoc 式标量赋值在Python 中可以使用三引号运算符完成

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
@_ = <Everthing is
in
the array
END
say "@_";
下面是等价的Python 代码,注意第一行是紧跟三引号运算符之后的

[python] view plaincopy在CODE上查看代码片派生到我的代码片string = '''''Everthing is
in
the array
'''
print (string)

2. Perl 中的列表
a. Perl 中的列表Python 中对应为列表和元组
下面是Python 中倒序排序一个列表的操作
[python] view plaincopy在CODE上查看代码片派生到我的代码片
my_list = ["Hello", "Python"]
my_list.append ("World")
my_list += ["!"]
print (my_list)
my_list.sort ();
my_list.reverse ();
for string in my_list:
print (string)
对应的Perl 同性质操作的版本

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
@_ = qw/Hello Perl/;
push @_, 'World';
@_ = (@_, '!');
print "@_\n";
@_ = reverse sort @_;
say for @_;

b. 常用的splice 操作在Python 中可以用过index () 方法和del 操作完成
下面是Perl 中常用的splice 操作
[plain] view plaincopy在CODE上查看代码片派生到我的代码片
@_ = qw/Hello Perl !/;
splice @_, 2, 0, "World"; # 插入元素
say "@_";
my @removed = splice @_, 1, 2; # 提取一段元素并在原列表删除
print "@_\n@removed\n";
Python 中对应的操作

[python] view plaincopy在CODE上查看代码片派生到我的代码片
my_list = ["Hello", "Python", "!"]
my_list.insert (2, "World") # 插入元素
print (my_list)
removed = my_list[1:2] # 提取一段元素
del my_list[1:2] # 并在原列表删除
print (my_list)
print (removed)

注意:Python 中元组和列表的区别
元组创建后是只读的,但是列表随时都可以被修改。3. Perl 中的哈希
a. Perl 中的哈希Python 中对应为字典和集合
一个Perl 哈希按照键值升序遍历的操作如下
[plain] view plaincopy在CODE上查看代码片派生到我的代码片
my %hash = (
"first" => 1,
"second" => 2,
"third" => 3 );
say "$_ => $hash{$_}" for sort keys %hash;
Python 中代码如下(注意定义变为花括号)

[python] view plaincopy在CODE上查看代码片派生到我的代码片
my_hash = {
"first" : 1,
"second" : 2,
"third" : 3 }
items = sorted (my_hash.items (), key=lambda e:e[1], reverse=False)
for item in items:
print (item[0], ':', item[1])

注意:Python 中集合与字典的不同之处
(a) 仅包含键,但是没有值
(b) set 可变,但是frozenset 不可变(如其名)4. Python 强类型的判断和赋值
一个非常大的不同之处:Perl 中赋值号默认的行为是拷贝,但是Python 中赋值号会创建一个对象的引用。
另外,因为和弱类型的Perl 不同,Python 是一门强类型语言,所以也有判断对象类型的必要。
下面代码演示了这些区别,首先是一段Python 代码
[python] view plaincopy在CODE上查看代码片派生到我的代码片
lst = [1, 2, 3]
lst2 = lst # lst2 是lst 的一个引用
print (lst)
lst2[1] = 2.5 # 所以修改lst2 也会引起lst 的变化
print (lst)
lst3 = copy.deepcopy (lst) # lst3 是lst 的一个深拷贝
lst3[1] = 2 print (lst) # 修改lst3 不会引起lst 的变化

# 因为Python 是强类型语言,所以需要类型判断操作
if lst == lst2: # 如果s 和s2 值相同
print ("lst equal to lst2")
if lst is lst2: # 如果s 和s2 是指向同一个对象的引用
print ("lst and lst2 is the same")
if type (lst) is type (lst3): # 如果s 和s3 类型相同
print ("lst and lst3 has same type")
下面是与之完全等价的Perl 代码,对比一下你就会很快了解其中的差别

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
my @lst = (1..3);
my $lst2 = \@lst; # lst2 是lst 的一个引用
say "@$lst2";
$lst2->[1] = 2.5; # 所以修改lst2 也会引起lst 的变化
say "@$lst2";
my @lst3 = @lst; # lst3 是lst 的一个深拷贝
$lst3[1] = 2;
say "@lst"; # 修改lst3 不会引起lst 的变化

=pod
因为Perl 是弱类型语言,所以不需要类型判断操作
但是Perl 中仍然可以做这样的操作——虽然没什么意义
=cut
say "lst equal to lst2"
if @lst == @$lst2; # 如果s 和s2 值相同
say "lst and lst2 is the same"
if \@lst == $lst2; # 如果s 和s2 是指向同一个对象的引用
say "lst and lst3 has same type"
if ref \@lst eq ref \@lst3; # 如果s 和s3 类型相同

5. Perl 中的“上下文”
上下文的判断几乎已经成了一名Perl 用户不可或缺的第六感,一个显而易见的例子是当你定义一个列表
[plain] view plaincopy在CODE上查看代码片派生到我的代码片
my @lst = (1..3);
当你循环遍历的时候,你深知把for 循环
[plain] view plaincopy在CODE上查看代码片派生到我的代码片
say for @lst; # 列表上下文
替换为While 循环
[plain] view plaincopy在CODE上查看代码片派生到我的代码片
say while @lst; # 标量上下文
究竟会得到什么灾难性的后果。

但是在Python 中你不必担心这个:Python 对于数据类型的解释很明确,不会因为上下文环境不同而改变,当你定义一个列表
[python] view plaincopy在CODE上查看代码片派生到我的代码片
lst = [1, 2, 3]
之后,你永远不必担心在什么特殊的上下文中lst 会被Python 解释为数值3。

面向对象编程1. 几点明显的异同
Perl 和Python 的面向对象给人的感觉是后者明显比前者更加规范,下面是自己感受最明显的几点异同。

a. 真的是面向对象么?1). Perl 中的“面向对象”更像是“面向过程”的文字游戏:类通过包实现、方法通过包中定义的函数实现、类的继承和方法的重载通过@ISA 列表查找循序实现、私有方法通过指向匿名函数的my 引用实现(因为my变量是本文件可见的)、运算符重载通过指向函数的引用实现、对象中成员变量的访问通过bless 到类名的引用实现……这样如果说有好处,那就是编程可以非常灵活——你可以用一个父类的多个子类共同继承出一个类(例如从哺乳动物中人类和猫类继承出一种新生物),Perl 完全对这种行为不在意,只要你确信这种近亲结婚的方式真的是你需要达到的目的。当然坏处显而易见——你可以轻而易举把代码写的糟糕透顶。所以Perl 的“面向对象”给人的感觉只是“面向过程”的另一种玩法——面向过程的本质没变,但是面向对象的效果达到了。2). Python 中的“面向对象”比Perl 要严谨和规范许多,非常类似于Java,如果你熟悉Java 或者C++,那么你会很好理解Python 的面向对象编程。

b. 包和类1). Perl 中两者完全等价,一个包就是一个类(pm 是Perl 模块的意思,但是它又被叫做包,而包就是类的意思 ← ←)。2). Python 中一个包可以包含多个模块,一个模块可以包含多个类。

c. 静态方法
Perl 和Python 中静态方法都是第一个参数不是类的引用的方法,但是稍有不同:1). Perl 中静态方法第一个参数是类名,可以通过bless 新的引用到类名来操作对象类型(例如你在构造方法里做的那样)。2). Python 中静态方法完全无法操作对象类型。

d. 私有方法:1). Perl 中的私有方法通过my 变量只有当前文件可见的性质,用保存匿名函数的my 引用来达到“私有”的目的(“面向对象”的文字游戏)。2). Python 中吧以“__”开头的方法都当作私有方法,通过方法名会变成"_类名__方法名" 的形式来避免其他类调用该方法,但是你仍然可以通过手动变换后的方法名直接调用私有方法。

e. 方法的传参:1). Perl 中一般将散列的引用bless 到类名,所以传参可以十分灵活,如果构造函数允许,参数个数和位置根本无关紧要,但是随之造成的问题就是可能引发混乱。2). Python 中方法声明无法把无默认值的参数放在有默认值的参数后面,但是因为实参可以通过给出参数名手动显式指定,所以次序也可以无关紧要。

f. 运算符重载:1). Perl 通过use overload 模块指定方法的引用来达到重载运算符的目的。2). Python 中通过一组特殊名称的方法来重载运算符。

g. 父类方法重载:1). Perl 中通过@ISA 列表的搜索顺序来达到重载父类方法的目的(子类的同名方法会被优先搜索到),并且可以显式SUPER 伪类访问被覆盖的基类方法(就如你经常在析构方法中做的一样)。2). Python 的重载更加正式,形式非常类似于C++。

h. 继承:1). Perl 的继承只是操作了@ISA 列表,子类中没有的方法会在@ISA 中寻找方法名,因此这种行为得到的结果和面向对象编程的继承相同。UNIVERSAL 是所有类的祖先类,提供了isa 方法用来测试继承关系。2). Python 的继承类似于C++,显式指定了要继承的父类,object 类是所有类的祖先类,提供issubclass 方法用来测试继承关系。2. 一个演示异同的例子
下面的两个例子都会有相同的输出,演示了Perl 和Python 中类的构造、析构、公有方法、私有方法、运算符重载、继承、父类方法重载等。
下面是预期的输出

[plain] view plaincopy在CODE上查看代码片派生到我的代码片=My name's Lucy, 2 years old. Adoption me please.
+I am hungry offen.
-My name's Leia, 1 years old. My host is iSpeller.
+I hate milk but my host give me offen.
-My name's Lucy, 2 years old. My host is iSpeller.
+I hate milk but my host give me offen.

perl和python选哪个: 就 语法来看,Python比Perl优美得多。Perl里面充满了像$!和$_这类的天书标记,初学的时候每读一段代码,就会碰到几个从来没见过的标记,然 后过两个星期,他们又以全新的面目出现在我面前。在我看来,这决不是什么紧凑,只是疯狂。不过同样的尼采,有的人看到的是伟大的哲学家,有的人看到的只是 一个疯子。

类库,Python的类库不如Perl的多。但是这很大程度上是因为Python没有一个像CPAN这样的类库集散地。其实Python的类库也是很全的,只是要找。SourceForge是一个,此外还有freshmeat。就我自己的经验,有些类库是无意中找到的。比方说,我看IBM的 developer network,看到一个twisted,安装的时候读了它的README,发现还有pycrypto,和pyopenssl类库。

如 果你觉得Python的开发效率还不及C++,那只能说你对Python还是太不熟悉,不过有C++的底子,用不了多久你就会闯过这一关的。其实 Python的文本处理能力一点都不比Perl逊色。它的re模块的思路同java的regex很像,而中文处理则要用到codecs。真正学懂之后,你 会觉得Python模块的逻辑性很强。不像Perl,虽然很方便,但是一个一个模块之间没有什么必然的联系。

关 于Python的大型项目,最知名的就是Zope,然后有twisted(它既是一个类库,也是一个framework)。此外还有 gadfly,medusa(其实这两个是Zope的子项目,但是Perl没有这个重量级的产品吧),以及Chandler。这些都是纯Python的程 序。

小米手机内置了python解释器,为什么不是perl: 人类真的是很奇怪,老是问为什么地下水的井盖是圆的,为什么不是正方形,为什么不是三角形。可能当他是正方形,是三角形的时候,又会问为什么不是圆形。那它总的有个形状吧。

他内置了python,就会问,为什么不是perl。如果他内置的是perl,到时候你也许会问为什么不是python,他总的安装一个吧。

为什么说perl的正则表达式功能比Python强大:

最大的分别就是.. 速度!

从各种的测试都显示, perl 的正则处理依然是最快的 (不只比 python) , 下面的实测可以去看看

https: 斜斜 stuffivelearned 点 org 斜 doku.php?id=programming%3ageneral%3aphpvspythonvsperl

其实 perl 本来就是正则的鼻祖, 它最初的开发的原意很大程度也是为了正则

至於为甚麼比 python 快其实不难想像

Perl 不是 OO 语言(虽然有 OO 的玩法), 所以用到正则时, 正接就开始跑, 不用继承一堆有的没的属性和方法. 至於 python 还要先把字串 compile 了做一个物件, 才开始做正则, 在底层自然又多了一重功夫

Python 的正则要靠模块来完成, Perl 的正则却已在 perl 解释器的心脏里, 谁会起动的更快就很明显了. 当然, 除了 C Python 还算最快之外, 其他如 JPython, Iron Python 这些要靠 framework 来起动的就必然更慢了


另外就是... 连击和助攻, perl 的正则很可以直接当成 expression (=~ 和 !~ ) 来用, 如:

use utf8;

$wantId = "陈大文";
die "帐号不能用奇怪字符" unless $wantId =~ /^[\w\d]+$/ ;

#或者 
%user = ( 
    1 => { Name => "王子" }, 
    2 => { Name => "小王子" } 
    3 => { Name => "王妹" } );
@姓王的 = grep { $user{$_}{Name} =~ /^王/ } keys %user; 
# @姓王的 = ( 1, 3)

# 又或者
%mask = ( 1 => "M", 2 => "X", 3 => "B" );
$password = "321"; #普通密码
$maskedPw = undef; #加密密码
$password =~ s/(.)/$maskPw .= $mask($1)/eg; 
# maskedPw = "BXM"上面几例, 试问用 python 要写多少行才做到用样的效果呢.. 不过, 这多少语言层次的问题, 姑且另作别论了.

从文件中提取符合要求的数据,编程语言不限,最好是perl/python/shell/vb/c其中的一种,采纳后另附送30分: #include <Windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

int main(void)
{
FILE *fp;
int i=0,j=0,l=0,m=0,second=0,snd=0,sec21=0,sec22=0,sec23=0;
char buf[10],first[10],str[10],t,orien[10];
char sb31[10],sb32[10],sb33[10],third[10],pthird[10];

if ((fp=fopen("xuan.txt","r"))==NULL)
{
printf("read err!\n");
exit(0);
}

memset(buf,0x00,10);
while (!feof(fp))
{
fscanf(fp,"%c",&t);

if (t!='\t' && t!='\n')
{
buf[i]=t;
i++;
}
else
{
i=0;
j++;
if (j==1)
{
strcpy(first,buf);
}
if (j==2)
{
second=atoi(buf);
}
if (j==3)
{
strcpy(third,buf);
}
memset(buf,0x00,10);

if (j==3)
{
l++;
j=0;
m++;
if (abs(second-snd)<2000 && strcmp(orien,first)==0)
{
if (m==1 && (strcmp(third,pthird)!=0))
{
strcpy(sb31,pthird);strcpy(sb32,third);sec21=snd;sec22=second;
}
else if (m==2 && strcmp(third,sb31)!=0 && strcmp(third,sb32)!=0)
{
strcpy(sb33,third);sec23=second;
}
else if (m==3 && strcmp(third,sb31)!=0 && strcmp(third,sb32)!=0 && strcmp(third,sb33)!=0)
{
printf(orien);printf("\t");itoa((l-3),str,10);printf(str);printf("---");itoa(l,str,10);printf(str);printf("\n");
strcpy(sb31,sb32);strcpy(sb32,sb33);strcpy(sb33,third);snd=sec21;sec21=sec22;sec22=sec23;sec23=second;
}
else if (m>3 && strcmp(third,sb31)!=0 && strcmp(third,sb32)!=0 && strcmp(third,sb33)!=0)
{
printf(orien);printf("\t");itoa((l-3),str,10);printf(str);printf("---");itoa(l,str,10);printf(str);printf("\n");
strcpy(sb31,sb32);strcpy(sb32,sb33);strcpy(sb33,third);snd=sec21;sec21=sec22;sec22=sec23;sec23=second;
}
else
{
m=0;
snd=second;
strcpy(orien,first);
}
}
else
{
m=0;
snd=second;
strcpy(orien,first);
}
strcpy(pthird,third);
}
}
}
fclose(fp);
return 0;
}

Linux服务器管理买什么书: 《linux就该这么学》或者《鸟哥的Linux私房菜》,上下两册,上册是基础篇,下册是服务器篇。

  • 2017高考语文多少

    XP系统使用共享打印机一打印就会自动关闭要打印的文件生产一个~S开头的隐藏文件,无法打印,怎么回事!!: 这个是临时文件 ,不管检查打印服务 我的电脑右键(控制面板)====管理-------服务print spoolerserver2个服务是否开启 ...

    825条评论 6037人喜欢 5043次阅读 348人点赞
  • only you 是谁唱的

    为什么有的小银行信用卡(例如哈尔滨银行)不能进行网上支付?: ta没有纳入网银支付联网系统,资格不够 ...

    319条评论 3876人喜欢 6087次阅读 271人点赞
  • 2017亚洲首富是谁

    电脑XP系统如何设置默认输入法?每次打字都得切换成搜狗输入法才行。: 在右下角菜单那里右键单击输入法…然后选择设置 ...

    267条评论 4770人喜欢 3673次阅读 457人点赞
  • nba中场休息是多久

    华硕x82s U盘装系统失败,装完win7系统硬盘启动就死机,换XP也装不上了,疯了,求高手!!!: 这个很有可能是你的硬件出现问题了......最大可能是内存,其次是显卡和cpu,,最后还有硬盘和声卡.... 建议你拆下硬盘换个电脑先装好系统,,然后再来这台机上试试,,如果还是死机,,基本上可确定...

    937条评论 3698人喜欢 3610次阅读 655人点赞
  • 2016年专业院校有哪些

    xp系统电脑前置没声音怎么设置:   一、xp为什么前置面板没声音:  如果前置面板没声音有两种原因造成,一种是装机时主板的线没有插好,另外一种是装好了系统,内部没有设置好。  二、如何解决XP前置面板没声音:  方法1、  1、点击电脑右下角的“开...

    472条评论 4166人喜欢 5103次阅读 743人点赞
  • iphone6换外屏玻璃多少钱

    如何破解xp系统管理员密码,带命令行模式也需要密码,如何修改啊?: 只能用PE工具光盘来修改密码了。你去网上找找很多的 ...

    895条评论 4076人喜欢 3727次阅读 898人点赞