为了一次性读取整个文件的内容到一个变量中, 我想这样干:
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中的标点符号变量, 自己要设置一个特殊值时, 把它安全地限定在一个作用域内, 并且尽量不让其它部分, 尤其是模块的代码受它的影响, 很多模块/代码的工作假设这些变量是默认的值.
阅读(1286) | 评论(0) | 转发(0) |