Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]8017[/thread]

[NEWBEE] String nach Suchmuster in eine V.ariable



<< >> 6 Einträge, 1 Seite
Wlet
 2006-05-24 17:52
#66567 #66567
User since
2006-05-24
15 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich bin recht neu was Perl angeht, und bitte daher um Entschuldigung, wenn ich eine recht triviale Frage stelle:

Ich habe eine Array-Variable, die ein String-Element folgender Form hat:
Code: (dl )
"To: [EMAIL=termin@tor.example]termin@tor.example[/EMAIL], Hans Meier <hans@meier.example>, [EMAIL=foo@bar.example]foo@bar.example[/EMAIL]"

Also die typische To:-Zeile einer E-Mail.

Nun möchte ich die Zeile nach "To: " in ein Array packen, sodass:
Code: (dl )
1
2
3
$adressen[0] = [EMAIL=termin@tor.example]termin@tor.example[/EMAIL];
$adressen[1] = Hans Meier <hans@meier.example>;
$adressen[2] = [EMAIL=foo@bar.example]foo@bar.example[/EMAIL];

Irgendwie bekomme ich das aber nicht hin.

folgende Code habe ich bis jetzt:

Code: (dl )
1
2
3
4
5
6
7
8
9
#@mail beinhaltet zeilenweise die Mail incl. Header
foreach my $line (@mail)
{
 if ($line=~/^To:/)
 {
   $to = $line =~ m/(^To: .*)/si;
  $File::Log::log->msg(4, "To Adressen: $to\n");
 }
}


Aber schon hier haperts. in $to habe ich eine "1" drinstehen.

Wer kann mir helfen?

cu

Wlet

edit pq: email-adressen nach RFC 2606 geändert\n\n

<!--EDIT|pq|1148491474-->
GwenDragon
 2006-05-24 17:57
#66568 #66568
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
Ein Muster liefert im Scalarkontext die Anzahl der Übereinstimmungen, als Listenkontext den übereinstimmenden Teil.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
@mail beinhaltet zeilenweise die Mail incl. Header
foreach my $line (@mail)
{
if ($line=~/^To:/)
{
  ($to) = $line =~ m/^To: (.*)/si;
  push @adressen, split(/,/, $to ); # Um sie bei den Kommata abzuteilen
#und ins Array $adressen zu sperren;)
 $File::Log::log->msg(4, "To Adressen: $to\n");
}
}
\n\n

<!--EDIT|GwenDragon|1148479274-->
Wlet
 2006-05-24 18:15
#66569 #66569
User since
2006-05-24
15 Artikel
BenutzerIn
[default_avatar]
Dankeschön... Aber ich war auch nicht untätig:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
my @recipients;
my $to;
foreach my $line (@mail)
{
if ($line=~/^To:/)
{
$to = $';
$File::Log::log->msg(4, "To Adressen: $to\n");
}

}
@recipients=split(/,/, $to);


So gehts auch ;)
GwenDragon
 2006-05-24 18:21
#66570 #66570
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
Es gibt eben verschiedene Lösungen. ;)
bloonix
 2006-05-24 19:54
#66571 #66571
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=Wlet,24.05.2006, 16:15]So gehts auch ;)[/quote]
Ne, so geht es halt nicht. Das ganze Konstrukt schaut etwas merkwürdig aus...

Code: (dl )
@recipients=split(/,/, $to);

steht ausserhalb der Schleife, also wird nur der letzte Treffer nach
@recipients gesplittet. Würde es in der Schleife stehen, dann würde
@recipients jedesmal überschrieben werden. Wenn du unbedingt auf
Arrays behaarst, dann eher so:

Code: (dl )
1
2
3
4
5
6
7
my @recipients;
foreach my $line (@mail) {
  next unless $line =~ /^To:\s*/;
  my $to = $';
  $File::Log::log->msg(4, "To Adressen: $to\n");
  push @recipients, [ split(/\s*,\s*/, $to) ];
}


Gruß,
opi

Edit: oder die push-Variante von Gwen und alle Adressen in einem Array.\n\n

<!--EDIT|opi|1148489611-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
Dubu
 2006-05-25 03:17
#66572 #66572
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Meine Empfehlung ist die Verwendung eines Paketes wie CPAN:Mail::Address oder CPAN:Mail::Message::Field::Addresses.

Die gezeigten Varianten machen nämlich alle die Grätsche, wenn Display Names (oder Kommentare) Kommata enthalten, was recht häufig vorkommt und bei einigen MUAs sogar standardmäßig aus Adressdaten generiert wird:
To: "Wall, Larry" <lwall@perl.example>

Außerdem habe ich die Vermutung, dass der obige Code nicht mit mehrzeiligen Adressfeldern arbeitet, die bei langen Empfängerlisten entstehen. Aber der eigentliche Mail-Parser wird ja nicht gezeigt.
<< >> 6 Einträge, 1 Seite



View all threads created 2006-05-24 17:52.