2 Stimmen

Unsicher bei der Referenzierung des Perl-Datentyps

Ich versuche, ein Skript mit Net::IMAP::Client zu schreiben, das den Inhalt einer E-Mail ausgibt, aber bisher wird jede Variable, die ich aus dem Modul ausgeben will, als etwas wie: ARRAY(0x86f5524) angezeigt oder gibt einen Fehler "Kann einen undefinierten Wert nicht als SCALAR-Referenz verwenden."

Die Modul-Dokumentation sagt, dass

# Vollständige Nachrichten abrufen
my @msgs = $imap->get_rfc822_body([ @msg_ids ]);
print $$_ for (@msgs)

Verweise auf einen Skalar enthalten sollte. @msg_id sollte ein Array von Zahlen für die E-Mail-Nummer im Posteingang sein, wird aber auch als Array-Referenz zurückgegeben.

Ich bin unsicher, wie ich diese Daten richtig ausgeben kann, damit sie lesbar sind. Hier ist die Modul-Referenz: Net::IMAP::Client

und hier ist ein Ausschnitt meines Codes:

use Net::IMAP::Client;
use Net::IMAP;
use Net::SMTP;
use strict;
use warnings;

my $imap = Net::IMAP::Client->new(
server => ,
user   => ,   # Ich habe diese Daten aus Datenschutzgründen weggelassen
pass   => ,
ssl    => ,
port   =>  ,
) or die "Konnte keine Verbindung zum IMAP-Server herstellen";

$imap->login or die('Anmeldung fehlgeschlagen: ' . $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);

EDIT: Ich habe Data::Dumper verwendet und einen großen Block mit Text erhalten, der die E-Mail und alle Formatierungstags enthält. Ich weiß auch, dass $imap->search etwas zurückgeben sollte, da der Posteingang 4 E-Mails enthält, 2 davon ungelesen sind. Aber da die Variable @data die E-Mails enthält, kann ich nicht herausfinden, wie ich sie im Output richtig dereferenzieren soll

0 Stimmen

Print Data::Dumper( \@data ) wird dir sagen, was im Rückgabewert von $imap->get_rfc822_body([@msg_id]) ist. Klingt so, als ob du nichts zurückbekommst.

0 Stimmen

$imap->search kann potenziell undef zurückgeben. Überprüfen Sie also zunächst, ob Sie einige Daten abgerufen haben.

5voto

Snorri Punkte 446

$imap->search('ALL') gibt eine Array-Referenz zurück, nicht ein Array. Daher musst du den Code ändern

my @msg_id = $imap->search('ALL');

zu

my @msg_id = @{$imap->search('ALL')};

Es wäre jedoch besser, zu überprüfen, ob die Methode einen definierten Wert zurückgegeben hat, bevor du dereferenzierst, falls sie fehlschlägt.

2voto

ikegami Punkte 340842

Beim Blick auf den Code ist die richtige Verwendung:

my $msgs = $imap->get_rfc822_body([ @msg_ids ]);
print $$_ for @$msgs;

Das dokumentierte Verhalten zu erhalten,

return $wants_many ? \@ret : $ret[0];

sollte sein

return $wants_many ? (wantarray ? @ret : \@ret) : $ret[0];

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X