文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>PHP 对比 PERL

PHP 对比 PERL

时间:2008-01-02  来源:061107


PHP 对比 PERL
本文是 http://tnx.nl/php - 如果你要复制他,请保持这个链接。
翻译:
ShiningRay
@
Nirvana Studio
目录

参数和返回值极其矛盾
要展示这个问题,下面有一个函数列表,里面的函数用来匹配用户定义的内容:(也许甚至那些用PHP的人才会使用这个文档,只是用来查看该用哪个函数:P)
 
匹配
替换使用
大小写不敏感
返回的数字
数组参数
返回匹配
s/m/x标志
偏移(-1=结尾)
ereg
ereg
 

所有

数组

0
ereg_replace
ereg
字符串

所有



0
eregi
ereg
 

所有

数组

0
eregi_replace
ereg
字符串

所有



0
mb_ereg
ereg[1]
 

所有

数组

0
mb_ereg_replace
ereg[1]
字符串/表达式

所有



0
mb_eregi
ereg[1]
 

所有

数组

0
mb_eregi_replace
ereg[1]
字符串

所有



0
preg_match
preg[2]
 
皆可
一个

数组

0
preg_match_all
preg
 
皆可
所有

数组

0
preg_replace
preg
字符串/表达式
皆可
无/所有



0
str_replace
str
字符串

所有

数字

0
str_ireplace
str
字符串

所有

数字

0
strstr, strchr
str
 

一个

子串

0
stristr
str
 

一个

子串

0
strrchr
str
 

一个

子串

-1
strpos
str
 

一个

索引

n
stripos
str
 

一个

索引

n
strrpos
char[3]
 

一个

索引

n
strripos
str
 

一个

索引

-1
mb_strpos
str[1]
 

一个

索引

n
mb_strrpos
str[1]
 

一个

索引

-1
这种问题还存在在其他的函数组里,不仅仅是匹配的这部分而已。
(在Perl中,所有这些功能都可以通过四个简单的操作符来完成。)
[1] 用于处理多字节字符
[2] PCRE regex: 所谓的“Perl兼容”的正则表达式。
[3] 在PHP5中也是字符串str
PHP对大小写不敏感的操作使用不同的函数
(这个可能会有两方面的争论。有些人认为提供不同的函数更好,即使这意味着又要记很多名词了)
在Perl中,你可以使用两个lc() 或者是 /i 标志,而PHP通常会提供一个大小写敏感的变量。而且,大小写不敏感的那些版本的函数名的命名方式也不一致。
Perl:
$foo cmp $bar
lc $foo cmp lc $bar
PHP:
strcmp($foo, $bar)
strcasecmp($foo, $bar)
 
 
 
Perl:
index($foo, $bar)
index(lc $foo, lc $bar)
PHP:
strpos($foo, $bar)
stripos($foo, $bar)
 
 
 
Perl:
$foo =~ s/foo/bar/
$foo =~ s/foo/bar/i
PHP:
$foo = str_replace('foo', 'bar', $foo)
$foo = str_ireplace(...)
PHP:
$foo = ereg_replace('foo', 'bar' ,$foo)
$foo = eregi_replace(...)
PHP的函数命名方式的不一致

  • 大小写不敏感的函数有一个’i'或者’case’在函数名的不同的位置。
  • 毫无表现上的规律 有下划线的 和 没下划线的: 下划线                   无下划线:stream_get_line          readline
    disk_free_space          diskfreespace
    is_object                isset
    mcal_day_of_week         jddayofweek
    set_error_handler        setlocale
    snmp_get_quick_print     snmpget
    get_browser              getallheaders
    base64_encode            urlencode
    image_type_to_mime_type  imagetypes
    msql_num_fields          mysql_numfields
    php_uname                phpversion
    strip_tags               stripslashes
    bind_textdomain_codeset  bindtextdomain
    cal_to_jd                gregoriantojd
    str_rot13                strpos
    Perl的核心函数名则没有含有下划线的。
  • PHP 有 unlink 、link 和 rename 和系统调用一致,但是 touch 的系统调用是 utime, 不是 touch。
  • 同时你也无法确定单词的顺序:

    • 宾语 动词:base64_decode, iptcparse, str_shuffle, var_dump
    • 动词 宾语:create_function, recode_string

    Perl的核心函数都是“动词 宾语”结构的除了替代的 dbm* 函数。(注意里面的 sys 是一个前缀,而不是一个宾语。同时 flock 和 lstat
    是根据系统调用命名的。shm* 和 msg* 是库函数调用)
  • “to” 还是 “2″?
    ascii2ebcdic, bin2hex, deg2rad, ip2long, cal_to_jd (jdto*, *tojd), strtolower,
    strtotime,

PHP没有词法范围
Perl 有词法范围和动态范围。PHP则没有。
对于为什么词法范围很重要的解释,可以参考
Coping with Scoping
.
 
PHP
Perl
超全局(Superglobal)

有[1]
全局(global)


函数局部


词法域(块局部)


动态域


[1] Perl有一些变量总是在main:: 命名空间中。这些类似于PHP的超全局变量。
[2] 在子过程的块中使用一个词法变量,就可以作为一个函数的局部变量。
PHP的主名空间中函数太多
(使用编译了所有核心分发包中的可用扩展的核心库,我们使用了2003年11月发布的版本)
PHP 主要函数的数量:3079 [1]
Perl主要函数的数量:206 [2]中值PHP 函数名长度:13
平均PHP 函数名长度:13.67
中值Perl函数名长度:6
平均Perl函数名长度:6.22
注意,Perl的一些函数有简短的等价语法:
readpipe('ls -l') ==> `ls -l`
glob('*.txt')     ==>
readline($fh)     ==>
quotemeta($foo)   ==> "\Q$foo"
lcfirst($foo)     ==> "\l$foo"  (lc is \L)
ucfirst($foo)     ==> "\u$foo"  (uc is \U)
[1] 来源:
PHP Quick Reference
[2] 来源:
perldoc perlfunc
PHP缺少抽象令 TIMTOWTDI* 走向糟糕的极端
*(There Is More Than One Way To Do It,有不止一种方式来完成它)
为什么PHP有3079个函数但是Perl却只有206个?在PHP中,常常有好几个十分相似的函数。在Perl中,你要了解和记住的要少很多。
另外一个重要的因素是模块的使用,尤其是DBI模块——它用来提供数据库支持,而不是把很多特性塞进内核,占用了空间却很少用到。
(不常用的模块不计算在内(所以这里排除了PHP的PEAR和Perl的IO::File)). 如果核心没有提供类似的功能,那么这些模块也会算在里面。为了简便起见,内部的工作方式将会忽略。)

  • 转义:

    • PHP: (14)
          dbx_escape_string, escapeshellarg, escapeshellcmd, pg_escape_bytea,
          pg_escape_string, pg_unescape_bytea, addslashes, addcslashes, preg_quote,
          quotemeta, mysql_escape_string, mysql_real_escape_string,
          mysqli_real_escape_string, sqlite_escape_string
    • Perl: (2) [1]
          quotemeta, $dbh->quote

  • 排序:

    • PHP: (16)
          sort, arsort, asort, krsort, ksort, natsort, natcasesort, rsort, usort,
          array_multisort, uasort, uksort, dbx_sort, imap_sort, ldap_sort, yaz_sort
    • Perl: (1)
          sort

  • 遍历列表:

    • PHP: (10)
      array_filter, preg_grep, array_search, array_unique, in_array, array_map,
      array_walk, array_count_values, array_change_key_case, array_sum
    • Perl: (2)
      map, grep

  • 分割:

    • PHP: (8)
      split, explode, strtok, spliti, chunk_split, mb_split, preg_split,
      str_split
    • Perl: (1)
      split

  • 匹配:

    • 字符串:

      • PHP: (11)
        strstr, strchr, stristr, strpos, strrchr, stripos, mb_strpos,
        mb_strrpos, strrpos, strripos, substr
      • Perl: (3)
        index, rindex, substr

    • 正则表达式:

      • PHP: (6)
        ereg, eregi, mb_ereg, mb_eregi, preg_match, preg_match_all
      • Perl: (1)
        m//

  • 替换匹配部分:
        * PHP: (12)
        ereg_replace, eregi_replace, mb_ereg_replace, mb_eregi_replace,
        preg_replace, str_ireplace, str_replace, ltrim, rtrim, trim, nl2br
        * Perl: (1)
        s///
  • 连接到数据库:

    • PHP: (17 或更多)
          dbx_connect, fbsql_connect, ibase_connect, msql_connect, msql_pconnect,
          mssql_connect, mysql_connect, odbc_connect, pg_connect, pg_pconnect,
          sesam_connect, ifx_pconnect, ifx_connect, sqlite_open, sqlite_popen,
          mysqli_connect, mysqli_pconnect
    • Perl: (2)
          DBI->connect, DBI->connect_cached

  • 打开(文件、进程等):

    • PHP: (5)
          dio_open, fopen, proc_open, popen, gzopen[2]
    • Perl: (2)
          open, sysopen

  • 读取/接收:

    • PHP: (12)
          dio_read, fread, gzread[2], socket_read, socket_recv, socket_recvfrom,
          socket_recvmsg, readline, fgetc, fgets, stream_get_line, file
    • Perl: (5)
          read, readline, sysread, recv, getc

  • 打印/输出/写入:

    • PHP: (14)
      print, echo, printf, fprintf, vprintf, dio_write, fwrite, fputs,
      gzwrite[2], socket_send, socket_sendmsg, socket_sendto, socket_write,
      socket_writev
    • Perl: (5)
      print, printf, syswrite, send, write

  • 关闭:

    • PHP: (7)
      closelog, dio_close, fclose, gzclose[2], pclose, socket_close,
      proc_close
    • Perl: (1)
      close

  • 常用/工具:

    • PHP:
      array_combine, array_fill, array_flip, array_merge, list, range, count,
      create_function, strtr, pow, putenv, getenv, getmygid, getmypid, getmyuid
    • Perl:
      使用语法或者魔术变量

[1] 因为系统的LIST语法和DBI的占位符,显式转义常常是不需要的。
[2] 在Perl中是由PerlIO层来处理的。
更多信息


  • Re^2: Is Perl a good career move?
    by Juerd, 2005

    • 依然没有命名空间
    • 没有闭包,甚至没有匿名函数
    • 没有良好的HTML分析器
    • 没有简单的MIME构建工具
    • 没有良好的WWW库
    • 没有 CPAN
    • 没有数组
    • 没什么用的逻辑操作符


  • Yaywoo!
    by Dave Brown, 2004

    • 使用system()无法避免(不安全的)shell
    • XY-problem
    • 大量的不同程序,但是,很多只是做了差不多的事情的变体
    • 第二参数和返回值毫无意义
    • 函数名的差劲拼写方式


  • Why PHP sucks
    by Edwin Martin, 2004,中文翻译
    为什么PHP令人不爽(对于大型系统)


    • 不良的递归支持
    • PHP 不是线程安全的
    • PHP 由于商业原因而不健全
    • 没有命名空间
    • 非标准的日期格式化字符
    • 混乱的许可证
    • 不一致的函数命名规则
    • 魔法引用地狱


  • Perl vs. PHP - octo’s subjektiver Vergleich
    by Florian Forster, 2003 (German)

    • Perl 比 PHP 快很多
    • Perl 比 PHP 更丰富
    • Perl 比 PHP 有更好的文档
    • PHP 缺乏模块化支持
    • PHP的here-docs对Windows用户毫无用途
    • PHP 缺少一致的数据库API
    • PHP 缓存数据库查询结果很危险
    • 图形上,PHP实际上被限制在了 GD 中


  • I hate PHP
    by Keith Devens, 2003

    • 白痴似的——调用时不推荐引用传递


  • Experiences of Using PHP in Large Websites
    by Aaron Crane, 2002

    • PHP 是推荐把表现和业务逻辑结合起来的
    • 没有命名空间造成很多问题
    • php.ini 的全局配置
    • 过分简单化导致了额外的复杂度


  • PHP Annoyances
    by Neil de Carteret, 2002

    • 没有真正的引用或者指针
    • 毫无命名空间的概念
    • 毫不组件化
    • 想变成Perl,但事实上也没想变成Perl
    • 没有标准的DB接口
    • 所有的PHP社区都是针对非程序员的
    • 不支持链式方法调用 (现在已经不是了 –tnx.nl)
    • 没有全局变量除非通过导入
    • register_globals 和 $_REQUEST 都让人痛心
    • 数组都是哈西表
    • PEAR 并不是 CPAN
    • Arrays 不能内插值替换成字符串(如$a=array();$b="$a";是错误的)
    • 没有类似 “use strict” 用来检验变量名的功能


  • PHP: A love and hate relationship
    by Ivan Ristic, 2002

    • 社区令我不安
    • 知识渊博的人少之又少
    • Zend 发布的文章还建议不安全的实践方式


  • My list of PHP shortcomings
    by Nathan Torkington, 2001

    • 没有命名空间
    • 所有的函数都是全局的
    • 没有真正的引用
    • 没有真实的数据结构 (现在已经不是了 –tnx.nl)
    • 没有匿名函数

参考
EFnet #php:
19:45  Comparing PHP to Perl is like comparing pears to newspapers
Perl Monks
: PHP - it’s “training wheels without the bike” — Randal L. Schwartz


相关阅读 更多 +
排行榜 更多 +
祖玛泡泡龙(经典祖玛)下载

祖玛泡泡龙(经典祖玛)下载

休闲益智 下载
网络掠夺者最新版下载

网络掠夺者最新版下载

休闲益智 下载
迷你冲撞小游戏中文版下载

迷你冲撞小游戏中文版下载

休闲益智 下载