perl常问问题集--第九篇

作者:凯旋网络来源:凯旋网络
tools套件(可自CPAN取得)不但可处理这个问题而且有许多其他的功能。有了这个套件,解BASE64码就变得像这麽容易:

useMIME::base64;
$decoded=decode_base64($encoded);

一个比较直接的解法是先做一点简单的转译,然後使用unpack()这个函数的``u''''格式:

tr#A-Za-z0-9 /##cd;#去除非base64字元
tr#A-Za-z0-9 /#-_#;#转换成uu码格式
$len=pack("c",32 0.75*length);#计算长度字元
printunpack("u",$len. perl常问问题集--第九篇 - 凯旋网络

perl常问问题集--第九篇

作者:凯旋网络来源:凯旋网络
content
  • 广告推荐
    );#uu解码後print


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

    如何根据使用者帐户名称自动合成email位址?
    在支援getpwuid【UNIX系统呼叫】、$<这个变数,和Sys::Hostname模组(标准perl发行的一部分)的系统上,您可试试这样的做法:

    useSys::Hostname;
    $address=sprintf(''s@s'',getpwuid($<),hostname);

    有的公司对email位址有统筹规画,因此这麽一来您可能会合成出不被公司的email主机接受的位址。所以如果有这类的顾虑的话,您应该直接向users要他们的email位址。而且,并不是所有能跑Perl的系统都像Unix一样,可以很容易得到这些资料。

    CPAN里的Mail::Util模组(MailTools套件的一部分)中有一个mailaddress()函数,它会试着去猜user的email位址。这个函数使用比上面的code聪明的方法,它会参考安装时所得到的设定资料,但是错误仍可能发生。所以,再一次地,最好的方法通常是直接问user本人。


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

    我的程式如何送/读email?
    送信:CPAN上头的Mail::Mailer模组(MailTools套件的一部分)只适合在Unix上使用,但利用到Net::SMTP的Mail::Internet模组则没有这个限制。读信:用CPAN上的Mail::Folder模组(MailFolder套件的一部分)或是用CPAN上头的Mail::Internet模组(也是MailTools套件的一部分)。

    #送信
    useMail::Internet;
    useMail::Header;
    #设定使用哪台主机
    $ENV{SMTPHOSTS}=''mail.frii.com'';
    #制作标头
    $header=newMail::Header;
    $header->add(''From'',''gnat@frii.com'');
    $header->add(''Subject'',''Testing'');
    $header->add(''To'',''gnat@frii.com'');
    #制作本文
    $body=''Thisisatest,ignore'';
    #产生mail物件
    $mail=newMail::Internet(undef,Header=>$header,Body=>\[$body]);
    #送出
    $mail->smtpsendordie;


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

    如何找出我的主机名/网域名/IP位址?
    长久以来许多code都很草率地直接呼叫`hostname`这个程式来取得主机名。虽然这麽做很方便,但也同时增加了移植到其他平台上的困难。这是一个很典型的例子,在方便和可移植性之间作抉择,不论选哪一边,必须付出一些牺牲和代价。

    Sys::Hostname这个模组(标准perl发行的一部分)可用来取得机器的名字,然後您便可利用gethostbyname()这个系统呼叫来找出该机的IP位址了(假定您的DNS运作正常)。

    useSocket;
    useSys::Hostname;
    my$host=hostname();
    my$addr=inet_ntoa(scalar(gethostbyname($name||''localhost'')));

    至少在Unix底下,取得DNS网域名最简单的方法大概要算是直接从/etc/resolv.conf这个档案里面找。当然,这麽做的前提是resolv.conf这个档案的设定必须照惯例的格式,还有就是这个档案必先存在才行。

    (Perl在非Unix系统下尚需要一有效的方法来测出机器和网域名)


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

    如何抓新闻讨论群的文章或群组名录?
    使用Net::NNTP或News::NNTPClient模组,两者皆可自CPAN下载。这些模组让抓群组名录这类的差事变得这麽容易:

    perl-MNews::NNTPClient
    -e''printNews::NNTPClient->;new->list("newsgroups")''


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

    如何抓/丢FTP档案?
    LWP
  • 广告推荐