Hallo, habe ein kleines Perl Programm (nicht selber geschrieben, von irgendeiner Webseite oder hier aus der Liste), welches die Absender Adresse aus einer Mail holt. Das klappt auch so weit, nur steht manchmal ein Leerzeichen davor. Damit klappt dann das Matching nicht mehr. Das Original sieht so aus: ,----[ getfromadress ]- | #!/usr/bin/perl -wn | # Picks out the actual address from the "From:" line | | unless (/\) { print; } else { print /<([^>]+)/, "\n"; } `---- Ich habe versucht es in folgendes umzubauen: ,----[ test ]- | #!/usr/bin/perl -wn | # Picks out the actual address from the "From:" line | | my($var) = ""; | | unless (/\) { $var .= $_; } else { $var .= /<([^>]+)/; } | | print $var; `---- Leider kommt da immer eine 1 raus. Da ich nicht viel mit Perl gemacht habe bin ich ein wenig aufgeschmissen. Vielleicht kann hier jemand helfen ? Ciao Sascha -- sa at programmers-world dot com http://www.livingit.de Boomarks online: http://www.mobile-bookmarks.info Soon available in english Mail geschrieben: Sonntag, den 08. Juni 2003 um 19:08
Sascha Andres wrote:
| unless (/\) { $var .= $_; } else { $var .= /<([^>]+)/; } | | print $var; `----
Leider kommt da immer eine 1 raus. Da ich nicht viel mit Perl gemacht habe bin ich ein wenig aufgeschmissen. Vielleicht kann hier jemand helfen ?
Weil Du $var nur zuweist ob der Vergleich geklappt hat, in deinem Falle "1" hat er geklappt ;-) Was hast Du denn genau vor ? Gruß, Andreas
Hi, Am 08.06.2003 (20:21) schrieb Andreas Winkelmann:
Weil Du $var nur zuweist ob der Vergleich geklappt hat, in deinem Falle "1" hat er geklappt ;-)
Die ursprüngliche Version hat dann und wann ein Leerzeichen zuviel. Nun habe ich im Internet folgenden Ausdruck gefunden: $var =~ s/\s+$// Dieser soll Leerzeichen am Anfang und Ende von $var entfernen. Mein Ansatz war daher, die gefundene Mail-Adresse nicht direkt auszugeben (da stand ja print; bzw der Ausdruck hinter print), sondern in eine Variable zu speichern, auf diese denAusdruck anzuwenden, und die Variable dann erst auszugeben. Ciao Sascha -- sa at programmers-world dot com http://www.livingit.de Boomarks online: http://www.mobile-bookmarks.info Soon available in english Mail geschrieben: Sonntag, den 08. Juni 2003 um 20:50
Sascha Andres wrote:
Hi, Am 08.06.2003 (20:21) schrieb Andreas Winkelmann:
Weil Du $var nur zuweist ob der Vergleich geklappt hat, in deinem Falle "1" hat er geklappt ;-)
Die ursprüngliche Version hat dann und wann ein Leerzeichen zuviel. Nun habe ich im Internet folgenden Ausdruck gefunden:
$var =~ s/\s+$//
Dieser soll Leerzeichen am Anfang und Ende von $var entfernen. Mein Ansatz war daher, die gefundene Mail-Adresse nicht direkt auszugeben (da stand ja print; bzw der Ausdruck hinter print), sondern in eine Variable zu speichern, auf diese denAusdruck anzuwenden, und die Variable dann erst auszugeben.
In $_ ist die Zeile "xxxx < yyy zzz >" /<([^>]*)/;$_=$1;s/^\s*//;s/\s+$//;$var=$_; Jetzt sollte in $var "yyy zzz" sein (Hoffe ich zumindest ;-)) Viel Glück... Gruß, Andreas
Hallo, On Sun, 08 Jun 2003, Sascha Andres wrote:
habe ein kleines Perl Programm (nicht selber geschrieben, von irgendeiner Webseite oder hier aus der Liste), welches die Absender Adresse aus einer Mail holt. Das klappt auch so weit, nur steht manchmal ein Leerzeichen davor. [..] ,----[ test ]-
Du sollst deine scripte nicht 'test' nennen!!! Das ist ein shell-builtin und ein normales Programm!
| #!/usr/bin/perl -wn | # Picks out the actual address from the "From:" line | | my($var) = ""; | | unless (/\) { $var .= $_; } else { $var .= /<([^>]+)/; } | | print $var; `----
Aeh, was soll das? Willst du denn die gesamten Header ausgeben?
Leider kommt da immer eine 1 raus.
Erstens verwendest du 'my' faslch. Entweder: my $var = ""; ## scalar = scalar oder: my ( $var ) = ( "" ); ## array = array Zweitens verwendest du 'm//' faschl, was der Grund fuer dein Problem ist. Siehe 'perldoc -f m'. Folgende Moeglichkeiten hast du: if(/^From: /) { my $var = ""; unless (/\) { $var .= $_; } else { if(/\<([^>]+)/) { $var = $1; } } print $var; } oder: if(/^From: /) { if(/\<([^>]+)/) { print $1; } else { print; } } oder: if(/^From: /) { my $var; unless(/\) { $var = $_; } else { ($var) = m/\<([^>]+)/; } print $var; } oder mit 's///': if(/^From: /) { if (/\) { s/.*\<([^>]+).*/$1/; } print; } Du kannst auch Hilfsvariablen verwenden, wenn du unbedingt willst: if(/^From: /) { if (/\) { s/.*\<([^>]+).*/$v = $1/e; } else { $v = $_; } print $v; } Oder natuerlich eine Variante von irgendeinem der Beispiele... TMTOWTDI! :) Noch Fragen? HTH, -dnh -- I'd beat my head against a wall but brain damage is the first step to an MCSE, and I'm not that far gone yet. -- random in asr
Hallo, [Nachtrag] On Sun, 08 Jun 2003, David Haller wrote:
Folgende Moeglichkeiten hast du:
if(/^From: /) { my $var = ""; unless (/\) { $var .= $_; } else { if(/\<([^>]+)/) { $var = $1; } } print $var; } [und Varianten]
Wenn du evtl. Leerzeichen entfernen willst, dann muesste folgende ungetestete(!) RE in allen Varianten funktionieren. /\<\s*([^>]+)\s*\>/ -dnh -- Linux is like a teepee: No windows, no gates, an Apache inside.
Hi, Am 08.06.2003 (21:34) schrieb David Haller:
Aeh, was soll das? Willst du denn die gesamten Header ausgeben?
Nein. Über formail wird nur die From Zeile reingeschmissen. Ist Teil eines Makros für Mutt.
Erstens verwendest du 'my' faslch. Entweder:
my $var = ""; ## scalar = scalar
oder:
my ( $var ) = ( "" ); ## array = array
Das Perl Tutorial habe ich gerade aus meinen Bookmarks gekilled ;)
[...] if(/^From: /) { my $var = ""; unless (/\) { $var .= $_; } else { if(/\<([^>]+)/) { $var = $1; } } print $var; } [...]
Habe mich für eine gewandelte Version dieser Hilfestellung entschieden. (Da nur die From Zeile reingeschmissen wird, ist das äußere if nicht notwendig)i Muß korrigiert heißen: $var =~ s/^\s+|\s+$//g; Dann habe ich noch die Leerzeichen entfernt und that's it. Danke für die Hilfestellungen. Auch an Andreas. Ciao Sascha -- sa at programmers-world dot com http://www.livingit.de Boomarks online: http://www.mobile-bookmarks.info Soon available in english Mail geschrieben: Sonntag, den 08. Juni 2003 um 21:49
Hallo, On Sun, 08 Jun 2003, Sascha Andres wrote:
Habe mich für eine gewandelte Version dieser Hilfestellung entschieden. (Da nur die From Zeile reingeschmissen wird, ist das äußere if nicht notwendig)i Muß korrigiert heißen:
$var =~ s/^\s+|\s+$//g;
Dann habe ich noch die Leerzeichen entfernt und that's it.
Das kannst du auch direkt mit einbauen, siehe meinen Nachtrag ;) -dnh -- Genau das ist das Problem. Ein PeeCee ist eben _kein_ Wunderding, sondern eine Maschine die _genau_ das macht was man ihr sagt, und das ist allzuoft einfach Mist, worauf sich die Maschine "verweigert" und abschmiert... *g* David Haller in SuSE-Talk [gef. v. "dere de herbert"]
Das klappt auch so weit, nur steht manchmal ein Leerzeichen davor. Wo steht ein Leerzeichen davor? Vor den ausgegebenen Adressen?
,----[ test ]- | #!/usr/bin/perl -wn | # Picks out the actual address from the "From:" line | | my($var) = ""; | | unless (/\) { $var .= $_; } else { $var .= /<([^>]+)/; } | | print $var; `---- Damit hängst Du im Fall 1 $_ an $var an, im Fall 2 hängst Du an $var an, ob der Match geklappt hat (1) oder nicht (undef).
So sollte es klappen: my ($var)= / ? /<([^>]+)/ : ($_); $var=~ s/^\s+//; -- +++ GMX - Mail, Messaging & more http://www.gmx.net +++ Bitte lächeln! Fotogalerie online mit GMX ohne eigene Homepage!
participants (4)
-
Andreas Winkelmann
-
David Haller
-
Sascha Andres
-
Stephan Hradek