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

mehrere Wertepaare aus einem String auslesen: String zerlegen



<< |< 1 2 >| >> 13 Einträge, 2 Seiten
Gast Gast
 2007-07-14 20:36
#78492 #78492
Hallo, habe folgendes Problem ...

Bekomme aus einer Java Anwendung mehrere Variablen an mein Perl-Skript übergeben (stdin) verpackt in einem String, in welchen jeweils der Variablenname und sein Wert mitgeliefert wird.

Der String wird im Moment so aufgebaut:
variable1=wert1&variable=wert2&variable3=wert3 ...
Dieser wird von mir dann mit "split" geteilt und weiter in einem Hash gespeichert.

Mein Problem ist jetzt folgendes: Es könnte auch in einem Wert, den ich übergebe bekomme ein z.B. "&"- oder "="-Zeichen enthalten sein. Weiß mir hier vielleicht einer zu helfen, wie ich das in den Griff bekommen kann? Kann ich evtl. schon in Java den String irgendwie so zusammensetzen, dass es sicher richtig zerlegt werden kann in Perl?

Vielen Dank im voraus,
Joseba
renee
 2007-07-14 20:49
#78493 #78493
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Mach' in Java ein "URI::escape". Damit solche Zeichen ersetzt werden!

In Java gibt es eine Klasse URLencode oder so ähnlich. Die sollte Dir helfen...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
pq
 2007-07-14 21:44
#78494 #78494
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=Guest,14.07.2007, 18:36]Der String wird im Moment so aufgebaut:
variable1=wert1&variable=wert2&variable3=wert3 ...
Dieser wird von mir dann mit "split" geteilt und weiter in einem Hash gespeichert.[/quote]
bitte benutze stattdessen CPAN:CGI.
Code: (dl )
1
2
3
use CGI ();
my $cgi = CGI->new;
my %hash = $cgi->Vars;
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Joseba
 2007-07-15 01:41
#78495 #78495
User since
2007-07-14
9 Artikel
BenutzerIn
[default_avatar]
Vielen Dank für Eure schnellen Antworten!

Das Problem ist, dass ich keine Module installieren kann/darf auf den Rechnern, auf welchen es später laufen soll. :(

Daher suche ich eine Methode um möglichst keine zusätzlichen Module zu verwenden.

Das CGI Modul ist (glaube ich) ein Standartmodul von Perl. Ich muss mal am Montag schauen, ob das auf meinen Maschinen vorhanden ist und melde mich dann evtl. noch.

Im Monet funktioniert es ungefähr so:
Code: (dl )
1
2
my $data = 'variable1=wert1&variable=wert2&variable3=wert3';
my %values =  split(/[=&]/, $data);
\n\n

<!--EDIT|Joseba|1184449935-->
pq
 2007-07-15 02:40
#78496 #78496
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=Joseba,14.07.2007, 23:41]Das Problem ist, dass ich keine Module installieren kann/darf auf den Rechnern, auf welchen es später laufen soll. :([/quote]
das ist unsinn.
Wiki:Wissensbasis.ModuleWieInstalliereIchEinModul
einfache perl-module lassen sich in den meisten fällen einfach
kopieren, es sind nämlich ganz simple dateien. (es gibt
ausnahmen, weshalb man den link oben lesen sollte)
es ist ein wahnsinnig verbreitetes missverständnis, man müsste
root-rechte haben, um zusätzliche perl-module zu benutzen.
wenn du das recht hast, eine .pl oder .cgi-datei auf den rechner
zu kopieren, warum dann keine .pm-datei?
Quote
Daher suche ich eine Methode um möglichst keine zusätzlichen Module zu verwenden.

Das CGI Modul ist (glaube ich) ein Standartmodul von Perl. Ich muss mal am Montag schauen, ob das auf meinen Maschinen vorhanden ist und melde mich dann evtl. noch.

ja, CGI ist ein standard-modul ab der version 5.004. also schon ewig.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Joseba
 2007-07-15 03:34
#78497 #78497
User since
2007-07-14
9 Artikel
BenutzerIn
[default_avatar]
[quote=pq,14.07.2007, 19:44]bitte benutze stattdessen CPAN:CGI.
Code: (dl )
1
2
3
use CGI ();
my $cgi = CGI->new;
my %hash = $cgi->Vars;
[/quote]
Die Kommunikation zwischen Java und Perl funktioniert nur über <stdin> und <stdout> über ein spezielles Protokoll.
Habe daher wirklich nur die eine Möglichkeit die Informationen aus Java in einem String zu bündeln und diesen über <stdin> in Perl einzulesen. Somit kann ich wohl $cgi->Vars() nicht nutzen. :(

Sorry für die vielen Fragen.
Kenne mich mit Perl sehr wenig aus.
pq
 2007-07-15 05:51
#78498 #78498
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=Joseba,15.07.2007, 01:34]Die Kommunikation zwischen Java und Perl funktioniert nur über <stdin> und <stdout> über ein spezielles Protokoll.
Habe daher wirklich nur die eine Möglichkeit die Informationen aus Java in einem String zu bündeln und diesen über <stdin> in Perl einzulesen. Somit kann ich wohl $cgi->Vars() nicht nutzen. :([/quote]
wieso nicht? du kannst CGI::new auch einen string übergeben.
Code: (dl )
my $cgi = CGI->new($string_from_java);
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Joseba
 2007-07-15 21:02
#78499 #78499
User since
2007-07-14
9 Artikel
BenutzerIn
[default_avatar]
[quote=pq,15.07.2007, 03:51]wieso nicht? du kannst CGI::new auch einen string übergeben.
Code: (dl )
my $cgi = CGI->new($string_from_java);
[/quote]
Okay, habe es mal probiert. Das mit dem String funktioniert zwar so, allerdings behebt es nicht so ganz mein Bedenken, dass richtig getrennt wird, falls z.b. ein Wert auch so ein "Trennzeichen" enthällt.

So funktioniert das ganze:
Code: (dl )
1
2
3
4
5
6
7
my $java_string = "var1=wert1;var2=wert2;var3=wert3";
my $cgi = CGI->new($java_string);
my %hash = $cgi->Vars;

foreach my $key (keys %hash){
 print "$key -> $hash{$key}\n";
}

Ausgabe:
var3 -> wert3
var1 -> wert1
var2 -> wert2

--

Falls der String aber z.B. so aussieht, dann geht es nicht mehr:
Code: (dl )
my $java_string = "var1=wert=;1;var2=wert2;var3=wert3";

Ausgabe:
var3 -> wert3
1 ->
var1 -> wert=
var2 -> wert2
renee
 2007-07-15 21:41
#78500 #78500
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=renee,14.07.2007, 18:49]Mach' in Java ein "URI::escape". Damit solche Zeichen ersetzt werden!

In Java gibt es eine Klasse URLencode oder so ähnlich. Die sollte Dir helfen...[/quote]
*Wiederhol*
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Ronnie
 2007-07-15 22:06
#78501 #78501
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
java.net.URLEncoder.encode("foo+bar");
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2007-07-14 20:36.