我正在尝试使用Net :: IMAP :: Client编写一个脚本来输出电子邮件的正文,但到目前为止,我尝试从模块输出的每个变量都显示为:ARRAY(0x86f5524)或者给出错误“不能将未定义的值用作SCALAR引用。”
模块文档说明
# fetch full messages
my @msgs = $imap->get_rfc822_body([ @msg_ids ]);
print $$_ for (@msgs)
应包含对标量的引用。 @msg_id应该是收件箱中电子邮件号码的数字数组,但也会作为数组引用返回。
我不确定如何正确输出这些数据,因此它是可读的。 以下是模块参考:Net::IMAP::Client
这是我的代码片段:
use Net::IMAP::Client;
use Net::IMAP;
use Net::SMTP;
use strict;
use warnings;
my $imap = Net::IMAP::Client->new(
server => ,
user => , # i omitted this data for privacy
pass => ,
ssl => ,
port => ,
) or die "could not connect to IMAP server";
$imap->login or die('Login Failed: ' . $imap->last_error);
my $num_messages = $imap->select('[Gmail]/All Mail');
my @msg_id = $imap->search('ALL');
print @msg_id;
print "\n";
my @data = $imap->get_rfc822_body([@msg_id]);
print $$_ for (@data);
编辑:我使用了Data :: Dumper并获得了一个包含电子邮件和所有格式标签的大块测试。我也知道$ imap-search应该返回一些东西,因为收件箱有4封电子邮件,2封未读。但是,因为变量@data IS持有电子邮件,我无法找出在输出中取消引用它的正确方法
答案 0 :(得分:5)
$imap->search('ALL')
会返回数组引用而不是数组。所以你需要改变
my @msg_id = $imap->search('ALL');
到
my @msg_id = @{$imap->search('ALL')};
最好在解除引用之前检查方法是否返回了定义的值,以防它失败。
答案 1 :(得分:2)
查看代码,正确的用法是:
my $msgs = $imap->get_rfc822_body([ @msg_ids ]);
print $$_ for @$msgs;
获取记录的行为,
return $wants_many ? \@ret : $ret[0];
应该是
return $wants_many ? (wantarray ? @ret : \@ret) : $ret[0];