不确定Perl数据类型引用

时间:2012-08-09 18:53:47

标签: perl imap

我正在尝试使用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持有电子邮件,我无法找出在输出中取消引用它的正确方法

2 个答案:

答案 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];