请描述这个表达式的功能

时间:2018-03-09 18:31:07

标签: perl

这是我的Perl代码

我想知道表达式join '', @{ $imap->top($i) }

中究竟发生了什么
use Email::Simple;
use Net::IMAP::Simple::Gmail;

my $server = 'imap.gmail.com';

my $imap = Net::IMAP::Simple::Gmail->new($server);
$imap->login( 'user@gmail.com' => 'user@742' );

my $nm = $imap->select('INBOX');
print "Emails Count == ", $nm;
print "\n";

print "How many emails you wants to read == ";
my $count = <STDIN>;

for (my $i = 1; $i <= $count; $i++ ) {
    my $es = Email::Simple->new( join '', @{ $imap->top($i) } );
    printf( "[%03d] %s\n\t%s\n", $i, $es->header('From'), $es->header('Subject') );
}

2 个答案:

答案 0 :(得分:3)

join '', @{$imap->top($i)}

这是做什么的:

首先我们得到变量$imap的值。它是一个局部变量(在上面声明为my $imap),它最好包含一个对象,因为我们将要调用一个方法。 (从技术上讲,它也可以包含类名,但->new通常会返回一个对象。)

然后我们得到变量$i的值,它是for循环中的局部变量(通常那些是for my $i (1 .. $count)编写的)。我们将其作为参数传递给top对象上的$imap方法。

然后(希望)此方法返回对数组的引用,因为我们将要取消引用它。 (从技术上讲,它也可以返回一个操作过载@{}的对象,但这种可能性较小。)

我们取消引用arrayref,它给了我们一个数组。 join为此操作提供列表上下文,因此我们将数组的内容作为列表获取。

最后join获取列表中的值,对它们进行字符串化并连接它们(使用''作为分隔符,即不使用分隔符)。结果是一个字符串。

答案 1 :(得分:-1)

@BLOCK@NAME相同,但BLOCK必须返回对要使用的数组的引用。

$imap->top($i)显然返回对数组的引用,在这种情况下@{ $imap->top($i) }返回该数组的元素。