From roland.bauer at fff.at Mon Dec 6 14:15:54 1999 From: roland.bauer at fff.at (Roland Bauer) Date: Thu Aug 5 00:24:03 2004 Subject: Sins of Perl Revisited Message-ID: <384C197A.BD525316@fff.at> * * * vienna-pm-list * * * Worueber man in Perl stolpern kann ... http://www.perl.com/pub/1999/11/sins.html Long ago, back in the Perl 4 days, Tom Christiansen wrote an article called The Seven Deadly Sins of Perl, describing the biggest problems in the Perl language at the time. A few years later, he went over the list again to see how well the problems had been addressed by Perl 5. That was in 1996; I think it's time for another update. Where are we now? -- roland.bauer@fff.at job: roland.bauer@mediaprint.at http://www.fff.at/fff/roland/ tel: +43-1-36000/3949 ### You are subscribed to vienna-pm-list http://www.fff.at/fff/vienna.pm/ From roland.bauer at fff.at Wed Dec 8 15:59:55 1999 From: roland.bauer at fff.at (Roland Bauer) Date: Thu Aug 5 00:24:03 2004 Subject: [Fwd: ] Zweiter deutschsprachiger Perl-Workshop 2000 Message-ID: <384ED4DB.A7E37FB7@fff.at> -- roland.bauer@fff.at http://www.fff.at/fff/roland/ job: +43-1-36000/3949 -------------- next part -------------- An embedded message was scrubbed... From: "Gerald Richter" Subject: Date: Wed, 8 Dec 1999 20:39:16 +0100 Size: 3630 Url: http://mail.pm.org/archives/vienna-pm/attachments/19991208/96e427e9/attachment.eml From roland.bauer at fff.at Sun Dec 19 10:32:57 1999 From: roland.bauer at fff.at (Roland Bauer) Date: Thu Aug 5 00:24:03 2004 Subject: Perl Line of the Day Message-ID: <385D08B9.2D151041@fff.at> * * * vienna-pm-list * * * Viele interessante und kommentierte Einzeiler: http://www.plover.com/~mjd/perl/LOD/ -- roland.bauer@fff.at http://www.fff.at/fff/roland/ job: +43-1-36000/3949 ### You are subscribed to vienna-pm-list http://www.fff.at/fff/vienna.pm/ From roland.bauer at fff.at Mon Dec 20 18:02:45 1999 From: roland.bauer at fff.at (Roland Bauer) Date: Thu Aug 5 00:24:03 2004 Subject: 5 .. 1 Message-ID: <385EC3A5.A10BA11B@fff.at> * * * vienna-pm-list * * * schon gewusst? print (1 .. 5); # 12345 print (5 .. 1); # nix roland -- roland.bauer@fff.at http://www.fff.at/fff/roland/ job: +43-1-36000/3949 ### You are subscribed to vienna-pm-list http://www.fff.at/fff/vienna.pm/ From roland.bauer at fff.at Mon Dec 20 18:13:00 1999 From: roland.bauer at fff.at (Roland Bauer) Date: Thu Aug 5 00:24:03 2004 Subject: 21 Message-ID: <385EC60C.6A3D55D1@fff.at> * * * vienna-pm-list * * * Das ist der aktuelle Mongers Count. Will nicht jemand a bisserl was posten? ;-) Keine Fragen? Keine neuen Erkenntnisse? Roland -- roland.bauer@fff.at http://www.fff.at/fff/roland/ job: +43-1-36000/3949 ### You are subscribed to vienna-pm-list http://www.fff.at/fff/vienna.pm/ From p.seitz at koehler-seitz.de Tue Dec 21 05:25:23 1999 From: p.seitz at koehler-seitz.de (Peter Seitz jun.) Date: Thu Aug 5 00:24:03 2004 Subject: Programmierung von Cookies Message-ID: <7D18114F8D@koehler-seitz.de> * * * vienna-pm-list * * * Hallo Leute, moechte der Postingaufforderung doch mal nachgehen :-) Ich moechte in naher Zukunft ein Webinterface fuer ein Suchsystem programmieren (im speziellen fuer eine Bibliothek). Das Problem bei so einem Interface ist allerdings, dass die Definitionen des Benutzers fuer die letzte Suche irgendwo zwischengespeichert werden muessen, falls der Benutzer die Suche weiter einschraenken will. Ich dachte mir, dass sowas miot Cookies zu realisieren sein muesste. Leider habe ich aber damit absolut keine Erfahrung. Gibts irgendwo eine Anlweitung, wie Cookies funktionieren, was man damit tun kann und wie man sie programmiert? Waere fuer jeden Tip dankbar. Gruss Peter Seitz Projektleiter Projekt Woerterbuch -- Interesse an einem freien deutschen Woerterbuch? Helfer gesucht! Projekt Woerterbuch: ### You are subscribed to vienna-pm-list http://www.fff.at/fff/vienna.pm/ From toni at soth.at Tue Dec 21 07:22:01 1999 From: toni at soth.at (Toni Andjelkovic) Date: Thu Aug 5 00:24:03 2004 Subject: Programmierung von Cookies In-Reply-To: <7D18114F8D@koehler-seitz.de> References: <7D18114F8D@koehler-seitz.de> Message-ID: <19991221142201.B26177@catacombs.soth.at> * * * vienna-pm-list * * * Peter Seitz jun. wrote on Tue, Dec 21 1999 (12:25:23 +0100): > moechte der Postingaufforderung doch mal nachgehen :-) same here :) > Gibts irgendwo eine Anlweitung, wie Cookies funktionieren, was man > damit tun kann und wie man sie programmiert? grunds?tzlich sind cookies technisch gesehen wie ein weiterer HTTP-header -- der server setzt sie mit einem "Set-Cookie:", der client gibt beim request einen "Cookie:" header mit. serverseitig kannst du sie somit wie einen gew?hnlichen HTTP-header printen, z. b. vor oder nach dem obligaten "Content-type:" (grob vereinfacht): my $value = int(rand(1000000)); print "Set-Cookie: NAME=$value\n\r"; print "Content-type:text/html\n\r\n\r"; lesen tust du sie ?ber die CGI-umgebungsvariable HTTP_COOKIE my $cookie = $ENV{'HTTP_COOKIE'}; my ($name,$value) = split(/=/,$cookie); du musst aber nicht alles ausprogrammieren, CGI.pm bringt bereits entsprechende funktionen f?r den umgang mit cookies mit. > Waere fuer jeden Tip dankbar. eine spezifikation des cookie-formats findest du unter http://developer.netscape.com:80/docs/manuals/js/client/jsref/cookies.htm zum lernen ist das buch http://www.oreilly.com/catalog/cgi2/index.html einigermassen brauchbar, obwohl nicht umwerfend. FAQ: http://www.webthing.com/tutorials/cgifaq.html vielleicht implementierst du das ganze lieber in einer serverseitig geparsten sprache wie z. b. php, bei perl musst du doch einiges "zu fuss" machen, wo dir php helfend unter die arme greift. cu, -- Toni Andjelkovic \ Hard Disk: A device that allows users to delete toni@soth.at \ vast quantities of data with simple mnemonic commands. ### You are subscribed to vienna-pm-list http://www.fff.at/fff/vienna.pm/ From marcel at 212186029246.11.vie.surfer.at Tue Dec 21 12:41:48 1999 From: marcel at 212186029246.11.vie.surfer.at (Marcel Grunauer) Date: Thu Aug 5 00:24:03 2004 Subject: Programmierung von Cookies In-Reply-To: <7D18114F8D@koehler-seitz.de> Message-ID: * * * vienna-pm-list * * * ++ Gibts irgendwo eine Anlweitung, wie Cookies funktionieren, was man ++ damit tun kann und wie man sie programmiert? CGI.pm hat einige Funktionen fuer Cookies. perldoc CGI Marcel ### You are subscribed to vienna-pm-list http://www.fff.at/fff/vienna.pm/ From marcel at 212186029246.11.vie.surfer.at Tue Dec 21 12:45:49 1999 From: marcel at 212186029246.11.vie.surfer.at (Marcel Grunauer) Date: Thu Aug 5 00:24:03 2004 Subject: 5 .. 1 In-Reply-To: <385EC3A5.A10BA11B@fff.at> Message-ID: * * * vienna-pm-list * * * == schon gewusst? == == print (1 .. 5); # 12345 == print (5 .. 1); # nix aber print reverse 1..5; # 54321 Funktioniert, weil 1..5 ja nur eine Liste (1,2,3,4,5) ist. Marcel ### You are subscribed to vienna-pm-list http://www.fff.at/fff/vienna.pm/ From seitz at bzs.tu-graz.ac.at Sun Dec 26 07:23:53 1999 From: seitz at bzs.tu-graz.ac.at (Peter Seitz) Date: Thu Aug 5 00:24:03 2004 Subject: Stringmanipulationen Message-ID: <2FEBC9F7B73@bzs.tu-graz.ac.at> * * * vienna-pm-list * * * Hallo Leute, ich habe einige Problemstellungen bei der Stringmanipulation, welche ich moeglichst elegant und effizient loesen moechte. Ich habe verschiedene Zeilen eines C++ Resource-Files zu parsen und ich moechte mir die erste in Hochkommas vorkommende Zeichenkette extrahieren. Hier mal 3 Beispiele: CONTROL "", -1, "static", SS_ETCHEDFRAME | WS_CHILD | WS_VISIBLE, -4, -16, 128, 86 CONTROL "Wir haben einen Text; zum bearbeiten bitte auf ""oeffnen"" klicken.", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 6, 6, 151, 18 CONTROL "Bitte geben Sie \"&eine\" uahl ein", 121, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 16, 88, 131, 12 Daraus ergeben sich folgende Probleme: Ich moechte ermitteln, wieviele "" in einer Zeile auftreten! Gibt es einen Befehl um die Haeufigkeit einer Zeichenkette zu ermitteln oder muss ich das mit einer Schleife selber zaehlen? Ich moechte mir den ersten String - sofern er nicht nur aus "" besteht - ermitteln. Bis jetzt habe ich das so geloest, indem ich zuerst die \" Paare und dann die "" Paare ersetzt habe, habe anschliessend die Zeile so aufgesplittet, dass die " als Trennzeichen dienten und dann im zweiten Feld den String gehabt. Dort hab ich dann wieder die Zeichen rueckersetzt. Also in etwa so: #!/usr/bin/perl -w $line= 'CONTROL "Wir haben einen Text; zum bearbeiten bitte auf ""oeffnen"" klicken.", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 6, 6, 151, 18'; print "Zeile='$line'\n"; # in $line ist eine zeile der Quelle abgespeichert $line =~ s/\\\"/\xff\xff\xff/g; # replace _\"_ $line =~ s/\"\"/\x7f\x7f\x7f/g; # replace _""_ @test = split (/"/, $line); $extracted_string = $test[1]; $extracted_string =~ s/\x7f\x7f\x7f/\"\"/g; # recreate _""_ $extracted_string =~ s/\xff\xff\xff/\\\"/g; # recreate _\"_ print "String='$extracted_string'\n"; Diese Prozedur wuerde ich mir allerdings sparen, wenn ich weiss, dass in der Zeile nur einmal ein "" vorkommt (also ein leerer String). Gibts irgendwelche Vorschlaege wie man das geforderte optimal und vor allem effizient programmieren kann, oder ist mein Loesungsweg nicht so schlecht? Gruss Peter Seitz Projektleiter Projekt Woerterbuch -- Interesse an einem freien deutschen Woerterbuch? Helfer gesucht! Projekt Woerterbuch: ### You are subscribed to vienna-pm-list http://www.fff.at/fff/vienna.pm/ From Roland.Bauer at mediaprint.at Mon Dec 27 03:21:18 1999 From: Roland.Bauer at mediaprint.at (Roland Bauer) Date: Thu Aug 5 00:24:03 2004 Subject: Antw: Stringmanipulationen Message-ID: * * * vienna-pm-list * * * Hallo Peter, an sich gibt es fuer comma separated Files auf CPAN ein spezielles Modul: Text-CSV, Aaaaaaaaaaaaber ... Das Modul mag offenbar nicht, wenn vor einem String, der mit " eingegrenzt ist ein Blank kommt. Wenn man das ausbessert, funktioniert es: #---------------------------------------------------------- require Text::CSV; my $text = <new; my $column = ''; if ($csv->parse($line)) { my @field = $csv->fields; my $count = 0; for $column (@field) { print ++$count, " => ", $column, "\n"; } print "\n"; } else { my $err = $csv->error_input; print "parse() failed on argument: ", $err, "\n"; } } #---------------------------------------------------------------- Ich weiss jetzt nicht, ob Dir das recht weiterhilft. Aber eventuell bessert das der Autor aus oder das Modul gibt Dir ein paar Ideen zur Optimierung Deines Codes. Und dann gibt es noch Text::CSV_XS, aber das macht bei mir Probleme bei der Installtion. Schoene Gruesse Roland -- Interesse an einem freien deutschen Woerterbuch? Helfer gesucht! Projekt Woerterbuch: ### You are subscribed to vienna-pm-list http://www.fff.at/fff/vienna.pm/ -- roland.bauer@mediaprint.at internet-applikationen TEL: +43-1-36000/3949 ### You are subscribed to vienna-pm-list http://www.fff.at/fff/vienna.pm/ From Roland.Bauer at mediaprint.at Mon Dec 27 03:50:25 1999 From: Roland.Bauer at mediaprint.at (Roland Bauer) Date: Thu Aug 5 00:24:03 2004 Subject: Projekt Woerterbuch Message-ID: * * * vienna-pm-list * * * Hallo Peter, Interesse an einem freien deutschen Woerterbuch? Helfer gesucht! Projekt Woerterbuch: Das hab ich mir durchgelesen und ich schlage vor, aus dem Projekt resultierende Perl-Fragen einfach hier zu klaeren ;-) Roland ### You are subscribed to vienna-pm-list http://www.fff.at/fff/vienna.pm/ -- roland.bauer@mediaprint.at internet-applikationen TEL: +43-1-36000/3949 ### You are subscribed to vienna-pm-list http://www.fff.at/fff/vienna.pm/ From marcel.grunauer at lovely.net Mon Dec 27 08:10:59 1999 From: marcel.grunauer at lovely.net (marcel.grunauer@lovely.net) Date: Thu Aug 5 00:24:03 2004 Subject: Stringmanipulationen In-Reply-To: <2FEBC9F7B73@bzs.tu-graz.ac.at> Message-ID: * * * vienna-pm-list * * * @@ Ich moechte ermitteln, wieviele "" in einer Zeile auftreten! @@ Gibt es einen Befehl um die Haeufigkeit einer Zeichenkette zu @@ ermitteln oder muss ich das mit einer Schleife selber zaehlen? my $count = () = ($zeile =~ /("")/g); @@ Ich moechte mir den ersten String - sofern er nicht nur aus "" @@ besteht - ermitteln. Bis jetzt habe ich das so geloest, indem ich @@ zuerst die \" Paare und dann die "" Paare ersetzt habe, habe @@ anschliessend die Zeile so aufgesplittet, dass die " als Trennzeichen @@ dienten und dann im zweiten Feld den String gehabt. Dort hab ich dann @@ wieder die Zeichen rueckersetzt. Also in etwa so: #!/usr/bin/perl -w use strict; while (my $zeile = ) { chomp $zeile; (my $testzeile = $zeile) =~ s/""//g; (my $match) = ($testzeile =~ /"([^"]+?)"/); print "$zeile: "; print (defined $match && length $match ? $match : "---"); print "\n"; } __DATA__ Wort1 "" "" noch was "gesuchtes" usw. nichts in dieser zeile hier auch "" nicht "" """""" aber nichts gesuchtes """" "das hier" "nicht" "" -- Marcel sub AUTOLOAD{($_=$AUTOLOAD)=~s;^.*::;;;y;_; ;;print} Just_Another_Perl_Hacker(); ### You are subscribed to vienna-pm-list http://www.fff.at/fff/vienna.pm/ From p.seitz at koehler-seitz.de Mon Dec 27 08:55:37 1999 From: p.seitz at koehler-seitz.de (Peter Seitz jun.) Date: Thu Aug 5 00:24:03 2004 Subject: Projekt Woerterbuch Message-ID: <110A253673F@koehler-seitz.de> * * * vienna-pm-list * * * On Mon, 27 Dec 1999 10:50:25 +0100 "Roland Bauer" wrote: Hallo Roland, > Hallo Peter, > > Interesse an einem freien deutschen Woerterbuch? Helfer gesucht! > Projekt Woerterbuch: > > Das hab ich mir durchgelesen und ich schlage vor, > aus dem Projekt resultierende Perl-Fragen einfach > hier zu klaeren ;-) Sehr gerne. Ich habe vor fuer das Projekt einige Perl-Programme bzs cgi-Programme zu schreiben, da PERL auf vielen Platformen vorhanden ist und kostenlos erhaeltlich ist. Insbesondere duerfte die Konvertierung von Zeichen von verschiedenen Codierungen eine erste Anwendung sein, sofern ich es nicht mit dem programm recode erschlagen kann. Gruss Peter Seitz Projektleiter Projekt Woerterbuch -- Interesse an einem freien deutschen Woerterbuch? Helfer gesucht! Projekt Woerterbuch: ### You are subscribed to vienna-pm-list http://www.fff.at/fff/vienna.pm/ From p.seitz at koehler-seitz.de Tue Dec 28 04:02:29 1999 From: p.seitz at koehler-seitz.de (Peter Seitz jun.) Date: Thu Aug 5 00:24:03 2004 Subject: Problem mit Array Message-ID: <123BFDA30F6@koehler-seitz.de> * * * vienna-pm-list * * * Hallo Perl Freunde, Ich hatte starke Probleme mit nachfolgendem Perl-Code. Ich wollte die Schluessel aus drei hashes in ein Array speichern, damit ich die vorhandenen Schluessel sortieren kann (dabei koennen einige Schluessel auch doppelt vorhanden sein). Wenn ich nun nur mit @string1 arbeite kommt es vor, dass komischerweise nur die Schluessel aus %strings_db_caption nicht auf @string1 abgespeichert werden. @string1 = (); while (($text, $help) = each %strings_db) { @string1 = (@string1, $text); } # merge caption database to string_xx hash while (($text, $help) = each %strings_db_caption) { @string1 = (@string1, $text); } # merge button database to string_xx hash while (($text, $help) = each %strings_db_button) { @string1 = (@string1, $text); } Nachdem ich den code wie folgt abgeaendert habe hat es (endlich) funktioniert, doch ich verstehe nicht wiso mein obiger Ansatz nicht zum richtigen Ergebnis fuehrt. @string1 = (); while (($text, $help) = each %strings_db) { @string1 = (@string1, $text); } # merge caption database to string_xx hash while (($text, $help) = each %strings_db_caption) { @string2 = (@string2, $text); } # merge button database to string_xx hash while (($text, $help) = each %strings_db_button) { @string3 = (@string3, $text); } @string1 = (@string1, @string2, @string3); Kann mir jemand von Euch auf die Spruenge helfen? Danke Gruss Peter Seitz Projektleiter Projekt Woerterbuch -- Interesse an einem freien deutschen Woerterbuch? Helfer gesucht! Projekt Woerterbuch: ### You are subscribed to vienna-pm-list http://www.fff.at/fff/vienna.pm/ From hjp at wsr.ac.at Tue Dec 28 04:40:20 1999 From: hjp at wsr.ac.at (Peter J. Holzer) Date: Thu Aug 5 00:24:03 2004 Subject: Problem mit Array In-Reply-To: <123BFDA30F6@koehler-seitz.de>; from Peter Seitz jun. on Tue, Dec 28, 1999 at 11:02:29AM +0100 References: <123BFDA30F6@koehler-seitz.de> Message-ID: <19991228114020.B14301@wsr.ac.at> On 1999-12-28 11:02:29 +0100, Peter Seitz jun. wrote: > Ich hatte starke Probleme mit nachfolgendem Perl-Code. Ich wollte die > Schluessel aus drei hashes in ein Array speichern, damit ich die > vorhandenen Schluessel sortieren kann (dabei koennen einige > Schluessel auch doppelt vorhanden sein). > Wenn ich nun nur mit @string1 arbeite kommt es vor, dass > komischerweise nur die Schluessel aus %strings_db_caption nicht auf > @string1 abgespeichert werden. > > @string1 = (); > while (($text, $help) = each %strings_db) { > @string1 = (@string1, $text); > } > # merge caption database to string_xx hash > while (($text, $help) = each %strings_db_caption) { > @string1 = (@string1, $text); > } > # merge button database to string_xx hash > while (($text, $help) = each %strings_db_button) { > @string1 = (@string1, $text); > } > > Nachdem ich den code wie folgt abgeaendert habe hat es (endlich) > funktioniert, doch ich verstehe nicht wiso mein obiger Ansatz nicht > zum richtigen Ergebnis fuehrt. Ich auch nicht. Der Code schaut richtig aus und bei mir funktioniert er auch. Wenn ich davor | %strings_db = ( a1 => A1, a2 => A2, a3 => A3 ); | %strings_db_caption = ( b1 => B1, b2 => B2, b3 => B3 ); | %strings_db_button = ( c1 => C1, c2 => C2, c3 => C3 ); und danach ein | print "@string1\n"; einf?ge ist das Ergebnis | a1 a2 a3 b1 b2 b3 c1 c2 c3 und das sollte es ja sein. Offenbar hast Du den Bug schon beseitigt. Ich nehme an, da? im Originalcode ein ?my @string1? zuviel vorkommt oder %strings_db_caption nicht sichtbar ist. Verwendest Du ?perl -w? und ?use strict?? Anmerkung zum Stil: Statt > while (($text, $help) = each %strings_db) { > @string1 = (@string1, $text); > } kann man auch | for $text (keys %strings_db) { | @string1 = (@string1, $text); | } schreiben, was IMHO besser zum Ausdruck bringt, da? hier nur die Keys des Hashes verwendet werden. Au?erdem f?llt da sofort auf, da? wir die Elemente eines Arrays (keys %strings_db) einzeln an ein anderes Array anh?ngen, was nicht besonders effizient ist. Die ganze schleife l??t sich also zu | @string1 = (@string1, (keys %strings_db)); bzw. | push (@string1, (keys %strings_db)); verk?rzen. hp -- _ | Peter J. Holzer | Nobody should ever have to be |_|_) | Sysadmin WSR / Obmann LUGA | ashamed if they have a secret love | | | hjp@wsr.ac.at | for writing computer programs that __/ | http://wsrx.wsr.ac.at/~hjp/ | actually work. -- Donald E. Knuth -------------- next part -------------- A non-text attachment was scrubbed... Name: not available Type: application/pgp-signature Size: 371 bytes Desc: not available Url : http://mail.pm.org/archives/vienna-pm/attachments/19991228/862a2b4b/attachment.bin From Roland.Bauer at mediaprint.at Tue Dec 28 05:02:58 1999 From: Roland.Bauer at mediaprint.at (Roland Bauer) Date: Thu Aug 5 00:24:03 2004 Subject: Antw: Problem mit Array Message-ID: * * * vienna-pm-list * * * Hallo Peter, warum Deine erste Version nicht funktioniert, weiss ich nicht, hm ... aber statt @string1 = (@string1, $text); wuerde ich push @string, $text; verwenden. und ausserdem: immer "use strict;" verwenden ;-) folgende loesung ist kuerzer: # ------------------------------------ use strict; # WICHTIG !!!!!! ;-) my %x = (a => 1, b => 2); my %y = (c => 1, d => 2); my %z = (e => 1, f => 2); my %alle = (%x, %y, %z); my @keys = keys %alle; print "@keys"; # -------------------------------------- wenn man die zwischenvariable %alle wegbringen will, muss man mit referenzen arbeiten. oder geht das auch einfacher? denn keys will unbedingt ein "%", aber (%x, %y, %z) ist eine liste ... mit anderen worten: $a . $b ... verkettet strings (@a, @b) ... verkettet listen %{ { %a, %b } } ... verkettet hashes (achtung, trick !!) # ----------------------------------- use strict; my %x = (a => 1, b => 2); my %y = (c => 1, d => 2); my %z = (e => 1, f => 2); my @keys = keys %{ { %x, %y, %z } }; print "@keys"; # -------------------------------------------------- roland -- roland.bauer@mediaprint.at internet-applikationen TEL: +43-1-36000/3949 ### You are subscribed to vienna-pm-list http://www.fff.at/fff/vienna.pm/ From p.seitz at koehler-seitz.de Wed Dec 29 05:28:02 1999 From: p.seitz at koehler-seitz.de (Peter Seitz jun.) Date: Thu Aug 5 00:24:03 2004 Subject: Problem mit Array Message-ID: <13D2E406301@koehler-seitz.de> * * * vienna-pm-list * * * On Tue, 28 Dec 1999 11:56:43 +0100 "Peter J. Holzer" wrote: Hallo Peter, [...] > > Nachdem ich den code wie folgt abgeaendert habe hat es (endlich) > > funktioniert, doch ich verstehe nicht wiso mein obiger Ansatz nicht > > zum richtigen Ergebnis fuehrt. > > Ich auch nicht. Der Code schaut richtig aus und bei mir funktioniert er > auch. Wenn ich davor > > | %strings_db = ( a1 => A1, a2 => A2, a3 => A3 ); > | %strings_db_caption = ( b1 => B1, b2 => B2, b3 => B3 ); > | %strings_db_button = ( c1 => C1, c2 => C2, c3 => C3 ); > > und danach ein > > | print "@string1\n"; > > einf?ge ist das Ergebnis > > | a1 a2 a3 b1 b2 b3 c1 c2 c3 > > und das sollte es ja sein. > > Offenbar hast Du den Bug schon beseitigt. Ich nehme an, da? im > Originalcode ein ?my @string1? zuviel vorkommt oder %strings_db_caption > nicht sichtbar ist. Verwendest Du ?perl -w? und ?use strict?? Ich verwende perl -w, allerdings kein use strict. Ich hatte da mal meine Schwierigkeiten mit den Variablendefinitionen. Ich habs dann der Einfachheit halber wieder weggelassen. Ich habe den Fehler leider nicht beseitigt. Ein my @string1 habe ich nicht verwendet (sollte ich wohl besser tun). Wie stelle ich fest, dass %strings_db_caption sichtbar ist? Ich schreibe vorher die Werte aus diesem Hash in eine eigene Datei und da waren alle dabei. > Anmerkung zum Stil: Statt Danke dafuer. Das ist insbesondere fuer Anfaenger (und dazu zaehle ich mich immer noch) sehr wichtig. > > > while (($text, $help) = each %strings_db) { > > @string1 = (@string1, $text); > > } > > kann man auch > > | for $text (keys %strings_db) { > | @string1 = (@string1, $text); > | } > > schreiben, was IMHO besser zum Ausdruck bringt, da? hier nur die Keys > des Hashes verwendet werden. Au?erdem f?llt da sofort auf, da? wir die > Elemente eines Arrays (keys %strings_db) einzeln an ein anderes Array > anh?ngen, was nicht besonders effizient ist. Die ganze schleife l??t > sich also zu > > | @string1 = (@string1, (keys %strings_db)); > > bzw. > > | push (@string1, (keys %strings_db)); > > verk?rzen. welches von den beiden letzten Ausdruecken ist dann der effizientere? Gruss Peter Seitz Projektleiter Projekt Woerterbuch -- Interesse an einem freien deutschen Woerterbuch? Helfer gesucht! Projekt Woerterbuch: ### You are subscribed to vienna-pm-list http://www.fff.at/fff/vienna.pm/ From p.seitz at koehler-seitz.de Wed Dec 29 05:40:18 1999 From: p.seitz at koehler-seitz.de (Peter Seitz jun.) Date: Thu Aug 5 00:24:03 2004 Subject: Antw: Problem mit Array Message-ID: <13D624D68F5@koehler-seitz.de> * * * vienna-pm-list * * * On Tue, 28 Dec 1999 12:05:08 +0100 "Roland Bauer" wrote: Hallo Roland, [...] > aber statt > > @string1 = (@string1, $text); > > wuerde ich > > push @string, $text; > > verwenden. > > und ausserdem: immer "use strict;" verwenden ;-) > > folgende loesung ist kuerzer: > > # ------------------------------------ > > use strict; # WICHTIG !!!!!! ;-) > > my %x = (a => 1, b => 2); > my %y = (c => 1, d => 2); > my %z = (e => 1, f => 2); > > my %alle = (%x, %y, %z); Das duerfte bei mir nicht klappen, da einige Schluessel identisch sind! Ich wuerde mir also einen bereits bestehenden Schluessel ueberschreiben (bzw den darauf abgespeicherten Wert). > > my @keys = keys %alle; > > print "@keys"; > > # -------------------------------------- > > > wenn man die zwischenvariable %alle wegbringen will, > muss man mit referenzen arbeiten. oder geht das auch > einfacher? > > denn keys will unbedingt ein "%", aber (%x, %y, %z) ist eine liste ... > > mit anderen worten: > > $a . $b ... verkettet strings > (@a, @b) ... verkettet listen > %{ { %a, %b } } ... verkettet hashes (achtung, trick !!) > > # ----------------------------------- > > use strict; > > my %x = (a => 1, b => 2); > my %y = (c => 1, d => 2); > my %z = (e => 1, f => 2); > > my @keys = keys %{ { %x, %y, %z } }; Ist wohl noch effizienter als der von Peter Holzer beschriebene Weg, oder? [...] Ich habe in einem Buch gelesen, dass man auch bei Perl sehr wohl auf die Code-Optimierung achten kann (insbesondere wenn Felder oft umgespeichert werden). Gruss Peter Seitz Projektleiter Projekt Woerterbuch -- Interesse an einem freien deutschen Woerterbuch? Helfer gesucht! Projekt Woerterbuch: ### You are subscribed to vienna-pm-list http://www.fff.at/fff/vienna.pm/ From Roland.Bauer at mediaprint.at Wed Dec 29 08:14:55 1999 From: Roland.Bauer at mediaprint.at (Roland Bauer) Date: Thu Aug 5 00:24:03 2004 Subject: Antw: Re: Problem mit Array Message-ID: * * * vienna-pm-list * * * >Ich verwende perl -w, allerdings kein use strict. Ich hatte da mal >meine Schwierigkeiten mit den Variablendefinitionen. Ich habs dann >der Einfachheit halber wieder weggelassen. Lieber nicht ... - Ehrlich !! >Ich habe den Fehler leider nicht beseitigt. Ein my @string1 habe ich >nicht verwendet (sollte ich wohl besser tun). Ja, solltest Du ... ;-) >Wie stelle ich fest, dass %strings_db_caption sichtbar ist? Ich >schreibe vorher die Werte aus diesem Hash in eine eigene Datei und da >waren alle dabei. Schick bitte das komplette Programm (inkl Tesdaten). > | @string1 = (@string1, (keys %strings_db)); > > bzw. > > | push (@string1, (keys %strings_db)); > > verk?rzen. welches von den beiden letzten Ausdruecken ist dann der effizientere? Was effizienter ist, weiss ich nicht, jedenfalls ist Variante 1 aus meiner Sicht fast Perl-untypisch. Variante 2 ist "normal". Es geht auch ohne Klammern: push @string1, keys %strings_db; Das ist mM nach auch besser lesbar als Variante 1. Und da gibt es - ausser "push" noch Befehle wie pop, shift, unshift. roland -- roland.bauer@mediaprint.at internet-applikationen TEL: +43-1-36000/3949 ### You are subscribed to vienna-pm-list http://www.fff.at/fff/vienna.pm/ From Roland.Bauer at mediaprint.at Wed Dec 29 08:25:53 1999 From: Roland.Bauer at mediaprint.at (Roland Bauer) Date: Thu Aug 5 00:24:03 2004 Subject: Antw: Problem mit Array Message-ID: * * * vienna-pm-list * * * 1, b => 2); my %y = (a => 1, d => 2); my %z = (e => 1, f => 2); my @keys = (keys %x, keys %y, keys %z); print "@keys"; # -------------------------------------------------- Aber willst Du wirklich nur die Keys oder nicht vielleicht ein Array mit allen Key-Value-Paaren? Roland -- roland.bauer@mediaprint.at internet-applikationen TEL: +43-1-36000/3949 ### You are subscribed to vienna-pm-list http://www.fff.at/fff/vienna.pm/ From hjp at wsr.ac.at Wed Dec 29 11:16:18 1999 From: hjp at wsr.ac.at (Peter J. Holzer) Date: Thu Aug 5 00:24:03 2004 Subject: Problem mit Array In-Reply-To: <13D2E406301@koehler-seitz.de>; from Peter Seitz jun. on Wed, Dec 29, 1999 at 12:28:02PM +0100 References: <13D2E406301@koehler-seitz.de> Message-ID: <19991229181618.G14301@wsr.ac.at> On 1999-12-29 12:28:02 +0100, Peter Seitz jun. wrote: > On Tue, 28 Dec 1999 11:56:43 +0100 > "Peter J. Holzer" wrote: > > Der Code schaut richtig aus und bei mir funktioniert er auch. Wenn > > ich [...] > > einf?ge ist das Ergebnis > > > > | a1 a2 a3 b1 b2 b3 c1 c2 c3 > > > > und das sollte es ja sein. > > > > Offenbar hast Du den Bug schon beseitigt. [...] > Ich habe den Fehler leider nicht beseitigt. Ein my @string1 habe ich > nicht verwendet (sollte ich wohl besser tun). Da war ich wohl nicht klar genug: Du hast offensichtlich beim K?rzen des Programms f?r die Mailinglist den Fehler beseitigt, denn im von Dir geposteteten Programmfragment tritt der Fehler nicht auf. Da? in Deinem Originalprogramm der Fehler noch nicht beseitigt ist, glaube ich Dir gerne. Nur ist es halt relativ schwer, einen Fehler in einem Code zu finden, wenn man einen anderen Code vor Augen hat. Daher bitte beim Posten von angeblich fehlerhaften Programmfragmenten sich zuerst ?berzeugen, da? der Fehler dort auch tats?chlich auftritt. Also am besten ein vollst?ndiges - aber m?glichst kurzes - Perlprogramm posten, das den Fehler demonstriert, wo man sagen kann, das sollte "a b c" ausgeben, gibt aber nur "a c" aus (als Beispiel). > Wie stelle ich fest, dass %strings_db_caption sichtbar ist? Ich > schreibe vorher die Werte aus diesem Hash in eine eigene Datei und da > waren alle dabei. Dann sollte es auch sichtbar sein, vorausgesetzt "vorher" bedeutet auch "im gleichen Scope" und nicht z.B. in einer anderen Subroutine, die dann die Subroutine, in der %strings_db_caption verwendet wird, aufruft. > > Die ganze schleife l??t sich also zu > > > > | @string1 = (@string1, (keys %strings_db)); > > > > bzw. > > > > | push (@string1, (keys %strings_db)); > > > > verk?rzen. > > welches von den beiden letzten Ausdruecken ist dann der effizientere? push - und zwar um L?ngen (hat mich selber ?berrascht). Hier sind die die User-CPU-Zeiten f?r 1000 inserts von einem Hash mit 3 Eintr?gen: while (($text, $help) = each %strings_db_caption) { ... 18.46 s for $text (keys %strings_db_caption) { ... 18.52 s @string1 = (@string1, (keys %strings_db_caption)); 6.39 s push (@string1, (keys %strings_db_caption)); 0.07 s Die Zeiten sind jeweils Median von 3 Versuchen, auf einem PII/233 mit perl 5.005_03 built for i386-linux. hp -- _ | Peter J. Holzer | Nobody should ever have to be |_|_) | Sysadmin WSR / Obmann LUGA | ashamed if they have a secret love | | | hjp@wsr.ac.at | for writing computer programs that __/ | http://wsrx.wsr.ac.at/~hjp/ | actually work. -- Donald E. Knuth -------------- next part -------------- A non-text attachment was scrubbed... Name: not available Type: application/pgp-signature Size: 371 bytes Desc: not available Url : http://mail.pm.org/archives/vienna-pm/attachments/19991229/369de526/attachment.bin From hjp at wsr.ac.at Thu Dec 30 02:58:30 1999 From: hjp at wsr.ac.at (Peter J. Holzer) Date: Thu Aug 5 00:24:03 2004 Subject: =?iso-8859-1?Q?Sicheres_=F6ffnen_von_Files_in_perl?= Message-ID: <19991230095830.A7034@wsr.ac.at> Vorbemerkung: Man stelle sich vor, im perl-Fragment unten h?tte $ARGV[0] den Wert '@|rm -rf /', und das in einem suid-Script. ----- Forwarded message from Henrik Edlund ----- Date: Wed, 29 Dec 1999 16:20:38 +0100 From: Henrik Edlund Subject: Re: majordomo local exploit To: BUGTRAQ@SECURITYFOCUS.COM > - -snip- > > # If the first argument is "@filename", read the real arguments > # from "filename", and shove them onto the ARGV for later processing > # by &Getopts() > # > if ($ARGV[0] =~ /^\@/) { > $fn = shift(@ARGV); > $fn =~ s/^@//; > open(AV, $fn) || die("open(AV, \"$fn\"): $!\nStopped"); > > - -snip- This security problem is as common as Perl scripts. Perl programmers should always specify for open what they want to do (read/write) and just not be lazy and skip that when they want to read. A simple fix like: open(AV, "< $fn") || die("open(AV, \"< $fn\"): $!\nStopped"); should fix this problem. As we specify that we are reading by using the < (less than) the script will simple choke and say that it can't open the filename starting with a | (pipe), instead of running the filename. There is no need, I believe, to use the sysopen function as someone else suggested earlier. I believe this security hole has been covered in some other advisory concerning all Perl (especially CGI) scripts. -- Henrik Edlund http://www.edlund.org/ "They were in the wrong place at the wrong time. Naturally they became heroes." Leia Organa of Alderaan, Senator ----- End forwarded message ----- -- _ | Peter J. Holzer | Nobody should ever have to be |_|_) | Sysadmin WSR / Obmann LUGA | ashamed if they have a secret love | | | hjp@wsr.ac.at | for writing computer programs that __/ | http://wsrx.wsr.ac.at/~hjp/ | actually work. -- Donald E. Knuth -------------- next part -------------- A non-text attachment was scrubbed... Name: not available Type: application/pgp-signature Size: 371 bytes Desc: not available Url : http://mail.pm.org/archives/vienna-pm/attachments/19991230/7c34c180/attachment.bin From seitz at bzs.tu-graz.ac.at Thu Dec 30 05:41:31 1999 From: seitz at bzs.tu-graz.ac.at (Peter Seitz) Date: Thu Aug 5 00:24:03 2004 Subject: Strict mode Message-ID: <35D0573546E@bzs.tu-graz.ac.at> * * * vienna-pm-list * * * Hallo Liste, ich habe ja geschrieben, dass ich mit dem strict mode etwas probleme hatte. Meine Literatur (Learning PERL/Schwartz, Christiansen, sowie zwei weitere Buecher) laesst sich hier nicht sehr ausfuehrlich ueber strict aus. Hier mein Problem: Ich habe zwei Konfigurationsdateien und ein Hauptprogramm. Wenn ich nun in den Konfig-Dateien eine Variable definiere, wie muss ich die dann definieren, dass die Werte auch im Hauptprogramm wieder gefunden werden. Hier waere ich fuer jeden Tip dankbar. Ich hoffe auch, dass ich in dieser Mailingliste weitere wertvolle Anregung finden werde, wie man effizient und in gutem Stiel in perl programmiert. Datei language.pl: ~~~~~~~~~~~~~~~~~~ %LanguageCode = ( 'ca', 'Catalan', 'cz', 'Czech', 'de', 'German', 'dk', 'Danish', 'ru', 'Russian', ); 1; # This must be the last line ------ end language.pl ------ Datei platform.rc ~~~~~~~~~~~~~~~~~ #===================================================================== # This is the configuration file for perl tools provided for the # Pegasus Mail Translation Process # # This file is needed to configure site specifig or platform specific # settings. When this file cannot be found, the perl tools won't run. # define the platform the tools are used on $platform = 0; # 0 = DOS/Windows # 1 = Unix/Linux #===================================================================== 1; # This must be the last line ------- end platform.pl ---------- Hauptprogramm: ~~~~~~~~~~~~~~ #!/usr/bin/perl -w # use strict; # do not allow implicit variable definition my $debug = 0; # debug setting (used in platform.rc) my $strings_db_file = "strings.db"; # Database for strings my $strings_db_button_file = "button.db"; # Database for buttons my $strings_db_caption_file = "caption.db"; # Database for captions my $strings_db_fonts_file = "fonts.db"; # Database for fonts my $strings_xx_file = "strings.xx"; # Strings to translate # now set some platform specific things... require "platform.rc"; # Get system settings print "Platform setting: $platform\n" if ($debug >5); --------- end testdatei ------- Ein Programmlauf schreibt mir nun: Global symbol "platform" requires explicit package name at t.pl line ... Nun die Frage, wie ich den Package Namen wirklich zuweise. Muss ich hier spezielle Definitionen machen? Ich schreibe ja kein Modul. Danke fuer Euere Tips und einen guten Start ins naechste Jahr(- tausend). With best compliments Peter Seitz -- Graz University of Technology, Austria - Fac. f. Civil Engineering mailto:seitz@bzs.tu-graz.ac.at - http://wwwbzs.tu-graz.ac.at/~seitz/ Member of the Pegasus Mail Support Group Coordinator of the Pmail Translation Process For information about translating Pegasus Mail, contact: Han van den Bogaerde (jaabogae@caiw.nl) or Peter Seitz (seitz@bzs.tu-graz.ac.at) ### You are subscribed to vienna-pm-list http://www.fff.at/fff/vienna.pm/ From marcel.grunauer at lovely.net Thu Dec 30 07:36:09 1999 From: marcel.grunauer at lovely.net (marcel.grunauer@lovely.net) Date: Thu Aug 5 00:24:03 2004 Subject: Strict mode In-Reply-To: <35D0573546E@bzs.tu-graz.ac.at> Message-ID: * * * vienna-pm-list * * * ?? Ein Programmlauf schreibt mir nun: ?? Global symbol "platform" requires explicit package name at t.pl line ... ?? ?? Nun die Frage, wie ich den Package Namen wirklich zuweise. Muss ich ?? hier spezielle Definitionen machen? Ich schreibe ja kein Modul. perldoc -f require: =item require EXPR [...] demands that a library file be included if it hasn't already been included. The file is included via the do-FILE mechanism, which is essentially just a variety of C. perldoc -f do: =item do EXPR [...] It also differs in that code evaluated with C cannot see lexicals in the enclosing scope; C does. Und das Perl Cookbook (Ram 8:16: Reading Configuration Files) sagt auch: As with a file read in using require or use, those read in using do count as a separate and unrelated lexical scope. That means the configuration file can't access its caller's lexical (my) variables, nor can the caller find any such variables that might have been set in the file. It also means that the user's code isn't held accountable to a pragma like use strict or use integer that may be in effect in the caller. If you don't want clean partitioning of variable visibility, you can get the config file's code executed in your own lexical scope. If you have a cat program or its technical equivalent handy, you could write yourself a hand-rolled do: eval `cat $ENV{HOME}/.myprogrc`; We've never actually seen anyone (except Larry) use that approach in production code. Mit anderen Worten, via require() kannst Du keine lexicals definieren, die dann im Hauptprogramm ohne weiteres verfuegbar sind. Es ist eigentlich zum definieren von allgemeinen subroutines gedacht. Oder fuer globale Variablen, aber die wollen wir ja vermeiden. Du solltest in Deinem Fall besser ein Modul definieren. Oder Du liest die Konfigurationsdatei als Textdatei und weist die gelesenen Werte einem Hash zu, allerdings geht i.A. nur fuer Skalare (ohne groeberen Aufwand). Z.B.: my %User_Preferences; while () { chomp; # no newline s/#.*//; # no comments s/^\s+//; # no leading white s/\s+$//; # no trailing white next unless length; # anything left? my ($var, $value) = split(/\s*=\s*/, $_, 2); $User_Preferences{$var} = $value; } Marcel ### You are subscribed to vienna-pm-list http://www.fff.at/fff/vienna.pm/ From Roland.Bauer at mediaprint.at Thu Dec 30 06:22:07 1999 From: Roland.Bauer at mediaprint.at (Roland Bauer) Date: Thu Aug 5 00:24:03 2004 Subject: Antw: Strict mode Message-ID: * * * vienna-pm-list * * * >ich habe ja geschrieben, dass ich mit dem strict mode etwas probleme >hatte. Die "einfachste" Loesung ist, jene Variablen, die als "global" angemeckert werden, explizit als global zu deklarieren: ich habe geaendert: 1) use vars eingefuegt (und $platform damit als global deklariert) 2) $debug auf 7 gesetzt # ----------------------------------------- #!/usr/bin/perl -w # use strict; # do not allow implicit variable definition use vars qw($platform); my $debug = 7; # debug setting (used in platform.rc) my $strings_db_file = "strings.db"; # Database for strings my $strings_db_button_file = "button.db"; # Database for buttons my $strings_db_caption_file = "caption.db"; # Database for captions my $strings_db_fonts_file = "fonts.db"; # Database for fonts my $strings_xx_file = "strings.xx"; # Strings to translate # now set some platform specific things... require "platform.rc"; # Get system settings print "Platform setting: $platform\n" if ($debug >5); # ------------------------------------------------------------------------------ >Ein Programmlauf schreibt mir nun: >Global symbol "platform" requires explicit package name at t.pl line ... Das ist Variante 2: Das tun, was Dir Perl empfiehlt ;-) "Global symbol "$platform" requires explicit package name" Also statt bloss $platform explizit $main::platform schreiben. (Denn wenn Du kein package definiert hast, bist Du im packge main) Ist aber NICHT empfehlenswert. Oder das ganze mit Modulen loesen. Das ist die sauberste Loesung. >Nun die Frage, wie ich den Package Namen wirklich zuweise. Muss ich >hier spezielle Definitionen machen? Ich schreibe ja kein Modul. Um ehrlich zu sein: Use strict wird (und will) Dich so lange nerven, bis Du freiwillig Module verwendest ... ;-) Denn Module sind das essentielle Feature ab Perl Version 5. Im Prinzip kommen dadurch bei jedem File am Beginn ca 3 bis 4 Zeilen Code dazu, die man eigentlich nur abschreiben muss: ---- File Platform.pm im Unterverzeichnis Woerterbuch/Config package Woerterbuch::Config::Platform; # wie du willstrequire Exporter; # fix@ISA = qw(Exporter); # fix@EXPORT_OK = qw($platform); # was Du exportieren willst$platform = ... ------------------------------------------- Hauptprogramm: #---------------- use strict; use Woerterbuch::Config::Platform qw($platform); print $platform; # --------------------------- Es ist eine gewisse Umstellung, erhoeht aber die Wartbarkeit Deiner Programme extrem. Denn ein Programm im Nachhinein zu modularisieren ist eine Wahnsinnsarbeit. Und wenn Du mehrere Leute mitarbeiten lassen willst, solltest Du das Programm unbedingt in Module zerteilen, damit sich die programme nicht gegenseitig stoeren (koennen). deshalb auch @EXPORT_OK statt @EXPORT damit die sache noch stricter wird ;-) roland -- roland.bauer@mediaprint.at internet-applikationen TEL: +43-1-36000/3949 ### You are subscribed to vienna-pm-list http://www.fff.at/fff/vienna.pm/