处理 SSI 文件时出错
网站工程
 规划发展   网页美工   标记语言   网页编程   Web服务器   广告攻略   开发常识   趋势研究   网站维护   网站数据库   网页设计工具
 论坛
您现在的位置: IT文谷 >> 网站工程 >> 网页编程 >> CGI >> 文章正文
perl常问问题集--第八篇perl常问问题集--第八篇2006-3-27 17:25:02perl常问问题集--第八篇2006-3-27 17:25:02perl常问问题集--第八篇
perl常问问题集--第八篇
perl常问问题集--第八篇perl常问问题集--第八篇2006-3-27 17:25:02perl常问问题集--第八篇2006-3-27 17:25:02perl常问问题集--第八篇
处理 SSI 文件时出错
perl常问问题集--第八篇perl常问问题集--第八篇2006-3-27 17:25:02perl常问问题集--第八篇2006-3-27 17:25:02perl常问问题集--第八篇

目录
篇名 
概述 
如何得知使用者正在哪个作业系统下执行我的 perl 程式? 
为什麽 exec() 不会传值回来? 
如何对 键盘/萤幕/滑鼠 做些花样? 
如何向使用者询问密码? 
如何对序列埠做读写动作? 
如何逆解加密後的密码档案? 
如何启动一个背景执行的程序? 
如何捕捉 控制字元/讯号? 
如何更动 Unix 系统上隐式密码档 (shadow password) 的内容? 
如何设定时间和日期? 
如何能够针对小於一秒的时间做 sleep() 或 alarm() 的动作呢? 
如何测量小於一秒的时间? 
如何做 atexit() 或 setjmp()/longjmp() 的动作?(例外处理) 
为何我的 sockets 程式在 System V (Solaris) 系统下不能用?「不支援本协定」这个错误讯息又是什麽意思? 
如何从 Perl 里呼叫系统中独特的 C 函数? 
在哪里可以找引入档来做 ioctl() 或 syscall()? 
为何 setuid perl 程式会抱怨关於系统核心的问题? 
如何打开对某程式既输入又输出的管道 (pipe)? 
为何用 system() 却得不到一个指令的输出呢? 
如何补捉外部指令的 STDERR? 
为何当管道开启失败时 open() 不会传回错误讯息? 
在输出值是空的情境里使用反向引号有何不对? 
如何不经过 shell 处理来呼叫反向引号? 
为何给了 EOF(Unix 上是 ^D,MS-DOS 上是 ^Z)後我的程式就不能从 STDIN 读取东西了呢? 
如何把 shell 程式转成 perl? 
perl 能处理 telnet 或 ftp 这种双向互动吗? 
如何在 Perl 里达到 Expect 的功能? 
有没有可能将 perl 的指令列隐藏起来,以躲避像 "ps" 之类的程式? 
我在 perl script 里 {更动目录,更改我的使用环境}。为何这些改变在程式执行完後就消失了呢?如何让我做的修改显露出来? 
如何关闭一个程序的档案把手而不用等它完成呢? 
如何 fork 出一个背景执行 (daemon) 程序? 
如何使我的程式和 sh 及 csh 一起执行? 
如何得知我是否正在互动模式下执行? 
如何让一个缓慢的事件过时? 
如何设定 CPU 使用限制? 
在 Unix 系统上如何避免产生僵 程序 (zombies)? 
如何使用一个 SQL 资料库? 
如何让 system() 在收到 control-C 後就离开? 
如何开启一个档案但不阻挡其他程序的阅读? 
如何安装一个 CPAN 模组? 
如何保有一份自己的 模组/程式库 目录? 
如何把我的程式所在位置加入 模组/程式库 搜寻路径? 
如何在执行时添加目录到自己的引入路径中? 
如何从终端机一次抓进一个按键?如果用 POSIX 模组时又该怎麽做? 
作者、译者与版权 

--------------------------------------------------------------------------------

篇名
perlfaq8 - 系统互动(原文版 Revision: 1.21, Date: 1997/04/24 22:44:19. 中文版 $Revision: 1.1 $, $Date: 1998/03/25 03:19:06 $)


--------------------------------------------------------------------------------

概述
这部份的 Perl 常见问题集涵盖关於与作业系统互动的问题。这包括了程序间通讯 [interprocess communication (IPC)]、使用者介面的控制(键盘、萤幕以及指标 装置),以及几乎所有和资料处理无关的事情。

请阅读特别针对你所使用的作业系统下的 perl 所写的常见问题集和文件(例如, perlvms 、perlplan9,...),以取得 perl 在个别差异方面更详尽的资料。


--------------------------------------------------------------------------------

如何得知使用者正在哪个作业系统下执行我的 perl 程式?
$^O 这个变数(若使用 English 模组就是 $OSTYPE)会指出你的 perl 解译器执 行档是替哪个作业系统、平台所建的。


--------------------------------------------------------------------------------

为什麽 exec() 不会传值回来?
因为这正是它所做的:它用另一个不同的程式来取代你当时所执行的。如果你的程 式需要继续跑下去(这可能正是你问此问题的原因吧?),改用 system() 。


--------------------------------------------------------------------------------

如何对 键盘/萤幕/滑鼠 做些花样?
连接/控制 键盘、萤幕和指标装置(「滑鼠」)的方法因作业系统的不同而有不 同;不妨试试下列模组: 

键盘 
    Term::Cap                   perl 标准内建模组
    Term::ReadKey               CPAN
    Term::ReadLine::Gnu         CPAN
    Term::ReadLine::Perl        CPAN
    Term::Screen                CPAN

萤幕 
    Term::Cap                   perl 标准内建模组
    Curses                      CPAN
    Term::ANSIColor             CPAN

滑鼠 
    Tk                          CPAN


--------------------------------------------------------------------------------

如何向使用者询问密码?
(这个问题跟全球资讯网一点关系也没有。如果你要找的是跟 WWW 有关的,那就 看另一份常见问题集吧。)

【译注:中文版的 Perl CGI 程式设计常见问题集可以在下列网址中找到: http://www.math.ncu.edu.tw/~chenym/FAQ/Perl/perl-cgi-faq/
http://2tigers.net/perl/perl-cgi-faq-chi/ 】

在 crypt 里面有个范例。首先,将你的终端机设为「无回应」[no echo] 模式,然後就用平常的方法将密码读入。你可以用老式的 ioctl() 函数、 POSIX 终端机控制函数(参看 POSIX ,和 Camel 书第七章),或是呼叫 stty 程式,这些方法的可携性/移植性程度都不一样。

你也可以在大部份系统上使用 CPAN 里的 Term::ReadKey 模组,这个模组较易使 用而且理论上也较据可携性/移植性。


--------------------------------------------------------------------------------

如何对序列埠做读写动作?
这端看你在什麽作业系统上执行你的程式。以 Unix 来说,序列埠可以透过 /dev 目录下的档案来撷取; 而在其他系统上,设备的名称无疑地会不一样。以下是一些 在设备互动时可能遭遇的共同问题: 

锁档 (lockfiles) 
你的系统可能会使用锁档来控制多重读写的情况。确定你用的是正确的协定。因为 当多个程序同时对一个装置做读取时可能会发生意想不到的情况。 
开档模式 
如果你打算对一个装置同时做读与写的动作,你得将它开到更新的模式( 在 open 里有更详细的解说)。如果你不希望冒着阻挡其他程序读取 这个装置的风险,那就得用 sysopen() 和 Fcntl 模组(标准 perl 的一部分)内 的 O_RDWR|O_NDELAY|O_NOCTTY。在 sysopen 里有对此方法更 详尽的解说。 
档案尾 
有些装置会等着在每行结尾处看到一个 ``\r'',而非 ``\n''。在某些平台上的 perl, ``\r''和 ``\n'' 与它们平常(在 Unix 上)所指的 ASCII 值 ``\015'' 和 ``\012'' 有 所不同。你也许得直接给定数值,例如用八进位 (``\015'')、十六进位 (``0x0D''), 或指定控制字元 (``\cM'')。 
    print DEV "atv1\012";       # 对某些装置来说是错误的
    print DEV "atv1\015";       # 对某些装置来说是对的

尽管对普通的文字档案,一个 ``\n'' 便可解决断行的问题,但目前在不同作业系统 间(Unix、DOS/Win 和 Macintosh),对於断行记号仍无统一标准,而只有用 ``\015\012'' 来当成 每行的结尾,然後再视需要去掉输出中不想要的部份。这 个做法尤其常用於 socket输出/输入 与自动洗清 (autoflushing),也是接下来 要讨论的主题。

洗清输出 
如果你希望 print() 的时候每个字元都要送到你指定的装置去,那你应自动清洗 你的档案把手,旧方法是: 
    use FileHandle;
    DEV->autoflush(1);

比较新的方法是:

    use IO::Handle;
    DEV->autoflush(1);

你可以用 select() 和 $| 变数来控制自动清洗的动作(参考 $| 和select ):

    $oldh = select(DEV);
    $| = 1;
    select($oldh);

你也可能看到不使用额外的暂存变数的写法,例如:

    select((select(DEV), $| = 1)[0]);

如同前一个项目所说的,这方法对 Unix 和 Macintosh 间的 socket 输出/入 没 用。在这种情况下,你得把你的行末字元写死在程式码内。

不挡式输入 (non-blocking input) 
如果你正在做一个具阻挡性的 read() 或 sysread() 动作,则你需要安排一个闹 铃把手或提供一个逾时设定(参看 alarm)。如果你是用非阻挡式的 开档,那麽就要配合非阻挡性?
perl常问问题集--第八篇perl常问问题集--第八篇2006-3-27 17:25:02perl常问问题集--第八篇2006-3-27 17:25:02perl常问问题集--第八篇
处理 SSI 文件时出错
  • 上一篇文章:

  • 下一篇文章:
  • 进入论坛讨论

    相关文章
    Visual Basic环境下Video/ Audio压缩数据流播放技术
    VB程序中处理随机事件
    VB编程的必备技巧
    让VB应用程序支持鼠标滚轮
    VB中Winsock控制的UDP协议的使用
    VB7新特性预览
    Visual Basic的未来预告
    [修正] 你想使MSFLEXGRID控件可编辑吗?
    制作半透明窗体
    AnimateWindow API
    从程序中生成Exe文件
    雨滴式的显示图片
    热门文章最新推荐

    版权与免责声明:
    ① 本网转载其他媒体稿件是为传播更多的信息,此类稿件不代表本网观点,版权归原作者所有,本网不承担此类稿件侵权行为的连带责任。
    ② 本站原创文章,转载时请注明出自文谷及作者姓名
    ③在本网BBS上发表言论者,文责自负。
    ④如您因版权等问题需要与本网联络,请在30日内联系 。
    perl常问问题集--第八篇perl常问问题集--第八篇2006-3-27 17:25:02perl常问问题集--第八篇2006-3-27 17:25:02perl常问问题集--第八篇
    perl常问问题集--第八篇perl常问问题集--第八篇2006-3-27 17:25:02perl常问问题集--第八篇2006-3-27 17:25:02perl常问问题集--第八篇

    全站热点
    最新推荐
    处理 SSI 文件时出错
    处理 SSI 文件时出错