Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2313965
  • 博文数量: 527
  • 博客积分: 10343
  • 博客等级: 上将
  • 技术积分: 5565
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-26 23:05
文章分类

全部博文(527)

文章存档

2014年(4)

2012年(13)

2011年(19)

2010年(91)

2009年(136)

2008年(142)

2007年(80)

2006年(29)

2005年(13)

我的朋友

分类: WINDOWS

2007-10-24 00:14:02

为了一次性读取整个文件的内容到一个变量中, 我想这样干:

my $mail_text ;
{
   undef $/;
   open(MAIL_BODY, "$mail_body_file") or die "Fail to open [$mail_body_file] $!";
   $mail_text = <MAIL_BODY>;
   close(MAIL_BODY);
}



单独拿这段代码运行没有问题, 问题是我正在尝试解决 nant不堪实用的mail任务, 想用perl的Mail::Sender::Easy 这个模块来替代. 这个模块使用起来比Mail::Sender简单, 就一个函数:

email({
        'from' => 'foo@bar.baz',
        'to' => 'you@ddre.ss',
        'cc' => 'your_pal@ddre.ss',
        'subject' => 'Perl is great!',
        'priority' => 2, # 1-5 high to low

        'confirm' => 'delivery, reading',
        'smtp' => '1.2.3.4',
        'port' => 26,
        'auth' => 'LOGIN',
        'authid' => 'foo@bar.baz',
        'authpwd' => 'protect_with_700_perms_or_get_it_from_input',
        '_text' => 'Hello *World* :)',
        '_html' => 'Hello World ',
        '_attachments' => {
            'smiley.gif' => {
                '_disptype' => 'GIF Image',
                '_inline' => 'smile1',
                'description' => 'Smiley',
                'ctype' => 'image/gif',
                'file' => '/home/foo/images/smiley.gif',
            },
            'mydata.pdf' => {
                'description' => 'Data Sheet',
                'ctype' => 'application/pdf',
                'msg' => $pdf_guts,
            },
        },
    }) or die "email() failed: $@";

奇怪的是这段代码跟在我上面的代码之后就一直报告说连接失败, 但同样用 Mail::Sender 写的一个小的样例就可以发, 一开始一直怀疑是哪个该设置的hash 条目没设置, 哪里拼写错误, 等等等等, 最后把上面的例子(直接从CPAN 上paste下来的) 拿来跟我自己的逐行比较, 实在没有什么可怀疑的地方了, 才想起来很多模块里都要用到文件句柄, 而只要用文件句柄就可能会读写, 会读写就可能受$/的影响, 仅仅在一个代码域内把$/ 置为undef还不行, 还必需先声明它在当前作用域内是 local的, 即动态作用域(通过栈维护).

加上一行 local $/; 万事大吉了.

教训: 对于perl中的标点符号变量, 自己要设置一个特殊值时, 把它安全地限定在一个作用域内, 并且尽量不让其它部分, 尤其是模块的代码受它的影响, 很多模块/代码的工作假设这些变量是默认的值.


阅读(1258) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~