编程学习biancheng.45soft.com 本站提供了各种在线教程和资料,供大家学习与参考.
编程学习
当前位置: 主页 > Perl > 可移植的Perl >

Perl 可移植的Perl


如果世界上只有一种操作系统,那么移植就会非常容易,但生活就会单调乏味。我们更喜欢有一大堆操作系统物种,只要我们的生态系统不要过于清晰地分成捕食动物和被捕食动物。Perl 可以在十几种操作系统上运行,并且因为 Perl 程序是平台无关的,同一个程序可以运行在所有这些系统上而不需要修改。


不错,是几乎不用修改。Perl 试图给程序员尽可能多的特性,但是如果你使用了属于某一操作系统的特殊特性,那么你就可能减少了你的程序向其他操作系统移植的机会。在本章里,我们将提供一些书写可移植的 Perl 代码的原则。一旦你决定了可移植性的程度,那么你就能明白界限在哪个位置,并且你就可以呆在里面。


从另外一个方面来看,书写可移植的代码通常就是有意限制你可以使用的选择。自然,这么干是需要纪律和牺牲的,这两个要求可能是 Perl 程序员不太习惯的东西。


请记住:不是所有 Perl 程序都需要移植。我们没有理由不用 Perl 把 Unix 工具粘合在一起,或者写一个 Macintosh 应用的原形,或者用来管理 Windows 的注册表。如果牺牲移植性是值得的,那么做牺牲呗。(注:不是任何对话都必须在多文化环境里正确。Perl 试图给你至少一个方法正确地处理事物,但是它并没有强制你如何做。在这方面,Perl 更象你的母语而不是保姆的语言。)


通常,我们要记住用户 ID,“家”目录,以及登陆状态等概念只有在多用户平台上才有。


特殊的 $^O 变量告诉你你的 Perl 是制作在什么操作系统上的。这个变量提高了程序的速度,否则程序就需要使用 use Config 通过 $Config{osname} 获取相同的信息。(就算你因为其他原因使用了 Config,这个变量也因为不用进行高负荷的散列查询而节约你的时间。)


要获取关于平台的更多信息,你可以在 %Config 散列中寻找剩下的信息,你可以在标准的 Config 模块中找到它。比如,要检查平台是否有 lstat 调用,你可以检查 $Config{d_lstat}。参阅 Config 的在线文档获取可用变量的全部描述,以及参阅 perlport 手册页获取 Perl 内建的函数在不同平台上的行为列表。下面是随着平台的变化其行为也变化的 Perl 函数:

-X(文件测试)accept, alarm, bind, binmode, chmod, chown, chroot, connect, crypt, dbmclose, dbmopen, dump, endgrent, endhostent, endnetent, endprotoent, endpwent, endservent, exec, fcntl, fileno, flock, fork, getgrent, getgrgid, getgrnam, gethostbyaddr, gethostbyname, gethostent, getlogin, getnetbyaddr, getnetbyname, getnetent, getpeername, getpgrp, getppid, getpriority, getprotobyname, getprotobynumber, getprotoent, getpwent, getpwnam, getpwuid, getservbyport, getservent, getservbyname, getsockname, getsockopt, glob, ioctl, kill, link, listen, lstat, msgctl, msgget, msgrcv, msgsnd, open, pipe, qx, readlink, readpipe, recv, select, semctl, semget, semop, send, sethostent, setgrent, setnetent, setpgrp, setpriority, setprotoent, setpwent, setservent, setsockopt, shmctl, shmget, shmread, shmwrite, shutdown, socket, socketpair, stat, symlink, syscall, sysopen, system, times, truncate, umask, utime, wait, waitpid

Perl
Perl 可移植的Perl