⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 perlfaq8.html

📁 《Perl 5教程》及《perl常问问题集》
💻 HTML
📖 第 1 页 / 共 3 页
字号:
<HR><H2><A NAME="perl_B_z_telnet_ftp_o_">perl 能处理 telnet 或 ftp 这种双向互动吗?</A></H2>试试 Net::FTP、TCP::Client 和 NET::Telnet 模组(CPAN 有)。 <A HREF="../../tppmsgs/msgs1.htm#121" tppabs="http://www.perl.com/CPAN/scripts/netstuff/telnet.emul.shar">http://www.perl.com/CPAN/scripts/netstuff/telnet.emul.shar</A>也有助於模拟 telnet 协定,但是 Net::Telnet 可能较容易使用。<P>如果你所要做的只是假装 telnet 但又不要起始 telnet 时的沟通程序,那麽以下这个标准的双程序方式就可以满足你的需要了:<P><PRE>    use IO::Socket;             # 5.004 才有的新模组    $handle = IO::Socket::INET-&gt;new('www.perl.com:80')            || die &quot;无法接上 www.perl.com 的 port 80: $!&quot;;    $handle-&gt;autoflush(1);    if (fork()) {               # XXX: undef 表示失败        select($handle);        print while &lt;STDIN&gt;;    # 将所有从 stdin 来的丢到 socket    } else {        print while &lt;$handle&gt;;  # 将所有 socket 来的丢到 stdout    }    close $handle;    exit;</PRE><P><P><HR><H2><A NAME="_p_b_Perl_F_Expect_">如何在 Perl 里达到 Expect 的功能?</A></H2>很久很久以前,有个叫做 chat2.pl 的程式库(perl 标准配备之一),但一直没 真正完工。现在,你的最佳选择就是从 <FONT SIZE=-1>CPAN</FONT> 来的 Comm.pl 程式库。<P><P><HR><H2><A NAME="_S_i_N_perl_O_C_">有没有可能将 perl 的指令列隐藏起来,以躲避像 "ps" 之类的程式?</A></H2>首先要注意的是,如果你的目的是为了安全(例如避免人们偷看到密码),那你应该重写你的程式,把重要的资讯从参数中剔除。光是隐藏起来不会让你的程式变得完全安全。<P>如要真的把看得见的指令列改掉,你可以设定 <CODE>$0</CODE> 这个变数值,如同 <A HREF="../../tppmsgs/msgs1.htm#100" tppabs="http://www.perl.org/CPAN/doc/manual/html/pod/perlvar.html#">perlvar</A>里写的。但这方法并非各种作业系统都适用。像 sendmail之类的背景程式 (daemons)就将它们的状态放在那儿:<P><PRE>    $0 = &quot;orcus [accepting connections]&quot;;</PRE><P><P><HR><H2><A NAME="_b_perl_script_A_">我在 perl script 里 {更动目录,更改我的使用环境}。为何这些改变在程式执行完後就消失了呢?如何让我做的修改显露出来?</A></H2><DL><DT><STRONG><A NAME="item_Unix">Unix</A></STRONG><DD>严格的说起来,这是做不到的-一个 script 的执行是从启动它的 shell 生出一 个不同的程序来执行。这个程序的任何变动不会反映到它的父程序,只会反映到更 改之後它自己创造出来的子程序。有个 shell 魔术可以让你藉着在 shell 里 <CODE>eval()你</CODE> script 的输出来装出这种效果,在 comp.unix.questions <FONT SIZE=-1>FAQ</FONT> 里有详 细内容。<P><DT><STRONG><A NAME="item_VMS">VMS</A></STRONG><DD>对 <CODE>%ENV</CODE> 的更改会持续到 Perl 离开,但是目录更动则不会。<P></DL><P><HR><H2><A NAME="_p_">如何关闭一个程序的档案把手而不用等它完成呢?</A></H2>假设你的系统支援这种功能,那就只要送个适当的讯号给此程序(参看 <A HREF="../../tppmsgs/msgs0.htm#68" tppabs="http://www.perl.org/CPAN/doc/manual/html/pod/perlfunc.html#kill">kill</A>)。通常是先送一个 <FONT SIZE=-1>TERM</FONT> 讯号,等一下下,然後再送个 <FONT SIZE=-1>KILL</FONT> 讯号去终结它。<P><P><HR><H2><A NAME="_p_fork_X_I_daemon">如何 fork 出一个背景执行 (daemon) 程序?</A></H2>如果你所指的是离线的程序(未与 tty 连线者),那下列的程序据说在大部份的 Unix系统都能用。非 Unix 系统的使用者应该检查 Your_OS::Process 模组看看有 没有其他的解决方案。<P><UL><LI><STRONG></STRONG>打开 /dev/tty 然後对它用 <FONT SIZE=-1>TIOCNOTTY</FONT> ioctl。请参考 <EM>tty(4)</EM><P><LI><STRONG></STRONG>把目录换到 /<P><LI><STRONG></STRONG>重开 STDIN、STDOUT <FONT SIZE=-1>STDERR</FONT> 使它们不会与旧的 tty 连接。<P><LI><STRONG></STRONG>用下列方法把程式丢到背景:<P><PRE>    fork &amp;&amp; exit;</PRE><P></UL><P><HR><H2><A NAME="_p_M_sh_csh_">如何使我的程式和 sh 及 csh 一起执行?</A></H2>参看 <EM>eg/nih</EM> 这 script(perl 原始码发行的一部分)。<P><P><HR><H2><A NAME="_p_o_O_b_U_">如何得知我是否正在互动模式下执行?</A></H2>问得好。有的时候 <CODE>-t STDIN</CODE> 和 <CODE>-t STDOUT</CODE> 可以提供线索,有时不行。<P><PRE>    if (-t STDIN &amp;&amp; -t STDOUT) {        print &quot;Now what? &quot;;    }</PRE><P><FONT SIZE=-1>POSIX</FONT> 系统中,你可以用以下方法测试你自己的程序群组与现在控制你终端机 的是否相同:<P><PRE>    use POSIX qw/getpgrp tcgetpgrp/;    open(TTY, &quot;/dev/tty&quot;) or die $!;    $tpgrp = tcgetpgrp(TTY);    $pgrp = getpgrp();    if ($tpgrp == $pgrp) {        print &quot;前景\n&quot;;    } else {        print &quot;背景\n&quot;;    }</PRE><P><P><HR><H2><A NAME="_p_w_C_L_H">如何让一个缓慢的事件过时?</A></H2>如同 <A HREF="../../tppmsgs/msgs0.htm#28" tppabs="http://www.perl.org/CPAN/doc/manual/html/pod/perlipc.html#Signals">Signals</A> 和 Camel 书第六章里所描述的,用 <CODE>alarm()</CODE> 函数, 或许再配合上一个讯号处理器。你也可以改用 <FONT SIZE=-1>CPAN</FONT> 里更具弹性的 Sys::AlarmCall 模组来做。<P><P><HR><H2><A NAME="_p_w_CPU_H">如何设定 CPU 使用限制?</A></H2>使用 <FONT SIZE=-1>CPAN</FONT> 里的 BSD::Resource 模组。<P><P><HR><H2><A NAME="_b_Unix_t_W_p_K_">在 Unix 系统上如何避免产生僵  程序 (zombies)?</A></H2>使用 <A HREF="../../tppmsgs/msgs0.htm#28" tppabs="http://www.perl.org/CPAN/doc/manual/html/pod/perlipc.html#Signals">Signals</A> 里面叫 reaper 的程式码,在接到 <FONT SIZE=-1>SIGCHLD</FONT> 时会呼 叫wait(),或是用 <A HREF="../../tppmsgs/msgs0.htm#68" tppabs="http://www.perl.org/CPAN/doc/manual/html/pod/perlfunc.html#fork">fork</A> 里面写的双 fork 技巧。<P><P><HR><H2><A NAME="_p_SQL_w_H">如何使用一个 SQL 资料库?</A></H2>有几个连接 <FONT SIZE=-1>SQL</FONT> 资料库非常好的界面。参看 <A HREF="../../tppmsgs/msgs1.htm#122" tppabs="http://www.perl.com/CPAN/modules/dbperl/DBD">http://www.perl.com/CPAN/modules/dbperl/DBD</A> 里的 <FONT SIZE=-1>DBD::*</FONT> 模组。<P><P><HR><H2><A NAME="_p_system_b_control_C">如何让 system() 在收到 control-C 後就离开?</A></H2>做不到。你需要摹仿 <CODE>system()</CODE> 呼叫(参看 <A HREF="../../tppmsgs/msgs0.htm#28" tppabs="http://www.perl.org/CPAN/doc/manual/html/pod/perlipc.html#">perlipc</A>里的范例程式),然後设计一个讯号处理器,让它把 <FONT SIZE=-1>INT</FONT> 讯号传给子程序。<P><P><HR><H2><A NAME="_p_L_">如何开启一个档案但不阻挡其他程序的阅读?</A></H2>如果你有幸使用到支援非阻挡性读取的系统(大部份 Unix 般的系统都有支援), 你只需要用 Fcntl 模组里的 <FONT SIZE=-1>O_NDELAY</FONT> 或 <FONT SIZE=-1>O_NONBLOCK</FONT> 旗标,配合 <CODE>sysopen():</CODE><P><PRE>    use Fcntl;    sysopen(FH, &quot;/tmp/somefile&quot;, O_WRONLY|O_NDELAY|O_CREAT, 0644)        or die &quot;can't open /tmp/somefile: $!&quot;;</PRE><P><P><HR><H2><A NAME="_p_w_CPAN_H">如何安装一个 CPAN 模组?</A></H2>最简单的方法就是让 <FONT SIZE=-1>CPAN</FONT> 这个模组替你代劳。这个模组包含在 5.004及以後的版 本中。如要手动安装 <FONT SIZE=-1>CPAN</FONT> 模组,或是任何按规矩发展的 CPAN模组,遵循以下步 骤:<P><OL><LI><STRONG><A NAME="item_"></A></STRONG>把原始码解开放到一个暂存区域<P><LI><STRONG><A NAME="item_"></A></STRONG><PRE>    perl Makefile.PL</PRE><P><LI><STRONG><A NAME="item_"></A></STRONG><PRE>    make</PRE><P><LI><STRONG><A NAME="item_"></A></STRONG><PRE>    make test</PRE><P><LI><STRONG><A NAME="item_"></A></STRONG><PRE>    make install</PRE><P></OL>如果你用的 perl 版本在编译时没有建入动态连结的功能,那你只消把第叁步 (<STRONG>make</STRONG>)换成 <STRONG>make perl</STRONG> 然後你就会得到一个新的 <EM>perl</EM> 执行档,里头连 有你新加入的延伸。<P>在 <A HREF="../../tppmsgs/msgs0.htm#98" tppabs="http://www.perl.org/CPAN/doc/manual/html/lib/ExtUtils/MakeMaker.html">MakeMaker</A>里面有更多关於建构模组的细节,并参考「如何保有 一份自己的模组/程式库目录?」这个问题。<P><P><HR><H2><A NAME="_p_O_v_w_">如何保有一份自己的 模组/程式库 目录?</A></H2>当你建构模组时,在产生 Makefiles 时使用 <FONT SIZE=-1>PREFIX</FONT> 选项:<P><PRE>    perl Makefile.PL PREFIX=/u/mydir/perl</PRE><P>然後在执行用到此 模组/程式库 的程式前先设好 <FONT SIZE=-1>PERL5LIB</FONT> 环境变数(参考 <A HREF="../../tppmsgs/msgs0.htm#87" tppabs="http://www.perl.org/CPAN/doc/manual/html/pod/perlrun.html#">perlrun</A>),或是用<P><PRE>    use lib '/u/mydir/perl';</PRE><P>进一步的资料可在 Perl 的 <A HREF="../../tppmsgs/msgs1.htm#123" tppabs="http://www.perl.org/CPAN/doc/manual/html/lib/lib.html#">lib</A> 手册中找到。<P><P><HR><H2><A NAME="_p_b_m_J_">如何把我的程式所在位置加入 模组/程式库 搜寻路径?</A></H2><PRE>    use FindBin;    use lib &quot;$FindBin:Bin&quot;;    use your_own_modules;</PRE><P><P><HR><H2><A NAME="_p_b_K_v_J">如何在执行时添加目录到自己的引入路径中?</A></H2>以下是我们建议更动引入路径的方法:<P><PRE>    PERLLIB 环境变数    PERL5LIB 环境变数    perl -Idir 指令列参数    use lib pragma, as in        use lib &quot;$ENV{HOME}/myown_perllib&quot;;</PRE><P>後者特别有用,因为它知道与机器相关的架构。lib.pm 机制模组是从 5.002 版开 始包含在 Perl 里面的。<P><P><HR><H1><A NAME="_p_q_i_H_p">如何从终端机一次抓进一个按键?如果用 POSIX 模组时又该怎麽做?</A></H1><PRE>    #!/usr/bin/perl -w    use strict;    $| = 1;    for (1..4) {        my $got;        print '给我: ';        $got = getone();        print &quot;--&gt; $got\n&quot;;    }    exit;</PRE><P><PRE>    BEGIN {        use POSIX qw(:termios_h);</PRE><P><PRE>        my ($term, $oterm, $echo, $noecho, $fd_stdin);</PRE><P><PRE>        $fd_stdin = fileno(STDIN);</PRE><P><PRE>        $term     = POSIX::Termios-&gt;new();        $term-&gt;getattr($fd_stdin);        $oterm     = $term-&gt;getlflag();</PRE><P><PRE>        $echo     = ECHO | ECHOK | ICANON;        $noecho   = $oterm &amp; ~$echo;</PRE><P><PRE>        sub cbreak {            $term-&gt;setlflag($noecho);            $term-&gt;setcc(VTIME, 1);            $term-&gt;setattr($fd_stdin, TCSANOW);        }</PRE><P><PRE>        sub cooked {            $term-&gt;setlflag($oterm);            $term-&gt;setcc(VTIME, 0);            $term-&gt;setattr($fd_stdin, TCSANOW);        }</PRE><P><PRE>        sub getone {            my $key = '';            cbreak();            sysread(STDIN, $key, 1);            cooked();            return $key;        }</PRE><P><PRE>    }    END { cooked() }</PRE><P><P><HR><H1><A NAME="_B_P_v">作者、译者与版权</A></H1>Copyright (c) 1997 Tom Christiansen and Nathan Torkington. All rights reserved. 有关使用、( 转 )发行事宜,详见 <A HREF="perlfaq.html" tppabs="http://202.96.217.5/~xiaoyi/perlfaq.html">perlfaq</A><P>译者:陈彦铭、萧百龄<P>中译版着作权所有:陈彦铭、萧百龄及两只老虎工作室。本中译版遵守并使用与原文版相同的使用条款发行。</BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -