Schrift
[thread]9039[/thread]

Perl Script Anpassung: Aus eins mach zwei...



<< |< 1 2 >| >> 13 Einträge, 2 Seiten
ManfredG.
 2007-05-26 02:25
#76971 #76971
User since
2007-05-26
11 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen,
ich bin gerade dabei ein Perl Script an meine Bedürfnisse anzupassen.

Mit dieser Zeile
. $t->{payment_method}->{public_data}->{holder_name}.
bekomme ich in meinem Script so eine Ausgabe "Vorname Nachname"

Ich benötige den Vornamen und den Nachnamen jetzt aber an zwei verschiedenen Stellen.
Gibt es eine Möglichkeit aus {holder_name} nur den ersten b.z.w. den zweizten Teil auszulesen?

Herzlichen Dank für Euere Hilfe.

Liebe Grüße
Manfred
bloonix
 2007-05-26 04:12
#76972 #76972
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=ManfredG.,26.05.2007, 00:25]Mit dieser Zeile
. $t->{payment_method}->{public_data}->{holder_name}.
bekomme ich in meinem Script so eine Ausgabe "Vorname Nachname"

Ich benötige den Vornamen und den Nachnamen jetzt aber an zwei verschiedenen Stellen.[/quote]
Hmmm nun eine Regex wird das Problem sicher nicht lösen!
Da musst du schon woanders anpacken... wie möchte man
zum Beispiel folgende Namen...

"Thomas Markus Schmidt"
"Heinz-Alfons van Aaken"

sauber trennen? Durch Whitespaces? Never. Im ersten Beispiel
ist $1 und $2 der Vorname, $3 der Nachname. Im zweiten
Beispiel genau andersrum. Das kann man nie 100% sicher
trennen. Wenn alle Datensätze aber immer zu 100% nur
einen Vornamen und einen Nachnamen haben, dann nimmst
du einfach split() oder ne Regex.

Code: (dl )
my ($vorname, $nachname) = split /\s/, $t->{payment_method}->{public_data}->{holder_name};


Ansonsten brauchst du Magie... davon hat Perl ja genug, aber
ich heute Abend zu wenig... gute Nacht! ;)\n\n

<!--EDIT|opi|1180138405-->
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.
ManfredG.
 2007-05-26 04:43
#76973 #76973
User since
2007-05-26
11 Artikel
BenutzerIn
[default_avatar]
Hallo,
ich denke ganz so super genau muß es gar nicht stimmen.

Wenn ich das so hinbekommen würde
- Letztes Wort = Nachname
- Alles davor = Vorname
wäre das schon klasse.

Wenn ich aber diese Zeile in mein Script schreibe,
kann das Script nicht mehr starten.

my ($vorname, $nachname) = split /\s/, $t->{payment_method}->{public_data}->{holder_name};

Ich bekomme dann diesen ERROR beim StartVersuch:
Global symbol "$t" requires explicit package name

Wie kann ich das denn lösen?

Herzlichen Dank für Euere Hilfe.

Liebe Grüße
Manfred\n\n

<!--EDIT|ManfredG.|1180140276-->
PerlProfi
 2007-05-26 13:56
#76974 #76974
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
Es wäre schon hilfreich wenn du mal ein bisschen mehr code zeigen könntest.
Der Fehlermeldung nach hast du das an der falschen Stelle in dein skript eingefügt.

MfG
bloonix
 2007-05-26 14:10
#76975 #76975
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=ManfredG.,26.05.2007, 02:43]Wenn ich das so hinbekommen würde
- Letztes Wort = Nachname
- Alles davor = Vorname
wäre das schon klasse.[/quote]
In der Praxis wird das aber voll daneben gehen. Was ist zum Beispiel
mit Frauen und Männern, die heiraten und ihren Nachnamen behalten
wollen und beide Nachnamen annehmen? :)

Die Daten müssen doch irgendwo her kommen... ein Formular? Eine
Datenbank? Da wird doch sicherlich Vor- und Nachname getrennt seinl...

Aber wie PerlProfi schon schrieb... lass mal ein paar Datensätze und
eventuell sogar Code sehen...\n\n

<!--EDIT|opi|1180174284-->
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.
betterworld
 2007-05-26 16:03
#76976 #76976
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
[quote=opi,26.05.2007, 12:10]Was ist zum Beispiel
mit Frauen und Männern, die heiraten und ihren Nachnamen behalten
wollen und beide Nachnamen annehmen? :)[/quote]
In dem Fall wird aber ein Bindestrich dazwischen gemacht, oder?
betterworld
 2007-05-26 16:07
#76977 #76977
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
[quote=ManfredG.,26.05.2007, 02:43]- Letztes Wort = Nachname
- Alles davor = Vorname[/quote]
Das sollte so gehen:
Code: (dl )
my ($vorname, $nachname) = $t =~ /^\s*(\S(?:.*\S)?)\s+(\S+)\z/s or die "Zu wenig Woerter";

Opis Loesung mit split hingegen wird immer nur die ersten beiden Woerter herausholen und den Rest wegschmeissen.

Die folgende Version sollte auch Sachen wie "van" und "de la" richtig behandeln, einfach anhand der Tatsache, dass sie normalerweise klein geschrieben sind:
Code: (dl )
1
2
3
4
5
6
7
my @komponenten = $t =~ /\S+/g;
my $vorname = shift @komponenten;
die "Zu wenig Woerter" unless @komponenten;
while (@komponenten > 1 && $komponenten[0] !~ /^[[:lower:]]/) {
$vorname .= ' ' . shift(@komponenten);
}
my $nachname = join ' ', @komponenten;
\n\n

<!--EDIT|betterworld|1180181773-->
ManfredG.
 2007-05-27 04:36
#76978 #76978
User since
2007-05-26
11 Artikel
BenutzerIn
[default_avatar]
[quote=ManfredG.,26.05.2007, 02:43]- Letztes Wort = Nachname
- Alles davor = Vorname[/quote]
Das sollte so gehen:
Code: (dl )
my ($vorname, $nachname) = $t =~ /^\s*(\S(?:.*\S)?)\s+(\S+)\z/s or die "Zu wenig Woerter";

Opis Loesung mit split hingegen wird immer nur die ersten beiden Woerter herausholen und den Rest wegschmeissen.

Die folgende Version sollte auch Sachen wie "van" und "de la" richtig behandeln, einfach anhand der Tatsache, dass sie normalerweise klein geschrieben sind:
Code: (dl )
1
2
3
4
5
6
7
my @komponenten = $t =~ /\S+/g;
my $vorname = shift @komponenten;
die "Zu wenig Woerter" unless @komponenten;
while (@komponenten > 1 && $komponenten[0] !~ /^[[:lower:]]/) {
$vorname .= ' ' . shift(@komponenten);
}
my $nachname = join ' ', @komponenten;



Hallo zusammen,
und erst einml herzlichen Dank für Euere Hilfe.

Ich denke, die obige Lösung wäre sicherlich ausreichend.
Es geht bei der ganzen Sache um die Übermittlung der Kontoinhaber Daten an ein Zahlungsgateway. Also KontoNr. BLZ und Kontoinhaber.
Wenn dabei kleinere Verwechslungen vorkommen sollten, bezüglich der exakten Zuordnung des Vornamens und des Nachnamens, ist das wahrscheinlich gar nicht so tragisch. Ich denke hauptsache in beiden Feldern steht etwas und beides zusammen ergibt den entsprechenden Kontoinhaber. Die obige Lösung würde also schon passen.

Wenn ich die empfohlene Zeile in mein Script eintrage,
bekomme leider immer noch diesen ERROR beim Versuch das Script zu starten:
Global symbol "$t" requires explicit package name

An was könnte das denn liegen?
Ich habe schon versucht die Zeile an unterschiedlichen Stellen zu positionieren...

Das betreffende Script hat um die 300 Zeilen.
Ist es für Euch eine Hilfe, wenn ich hier einmal das ganze Script poste?

Herzlichen Dank für Euere Hilfe.

Liebe Grüße
Manfred\n\n

<!--EDIT|ManfredG.|1180226686-->
MisterL
 2007-05-27 10:32
#76979 #76979
User since
2006-07-05
334 Artikel
BenutzerIn
[default_avatar]
Moin.

Quote
Global symbol "$t" requires explicit package name

Ein Rateversuch ins Blaue: $t fehlt bei der Initialisierung ein "my"
Zum Bleistift so:
Code: (dl )
 my $t = 0;

Oder
Code: (dl )
 my ($t,...) = @_; 


Aber dazu müsste man jetzt den kompletten Code kennen. Wegen der Menge aber bitte als Download...

Gruss MisterL
“Perl is the only language that looks the same before and after RSA encryption.”
bloonix
 2007-05-27 22:13
#76980 #76980
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=ManfredG.,27.05.2007, 02:36]Opis Loesung mit split hingegen wird immer nur die ersten beiden Woerter herausholen und den Rest wegschmeissen.[/quote]
für opis Lösung war die Voraussetzung...

Quote
Wenn alle Datensätze aber immer zu 100% nur einen Vornamen und einen Nachnamen haben

;)
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.
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2007-05-26 02:25.