Schrift
[thread]7394[/thread]

Wer kann mir bitte das Skript erklären?



<< >> 5 Einträge, 1 Seite
philo
 2005-10-25 14:51
#59259 #59259
User since
2005-10-25
2 Artikel
BenutzerIn
[default_avatar]
hallo, wer kann mir bitte dieses skript erklären?
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
$/ = "\x1f\x0a";

%records = ();
%termtoid = ();

my $recid = "";
while(<>) {
 chomp;
 s/\n([[:upper:][:digit:]])/ $1/g;
 s/\n//g;

 s/% /%/g;

 if (/(..)=(.*)/) {
   my $key = $1;
   my $val = $2;

   #print qq([$key]=[$val]\n\n);

   if ($key eq 'NR') {
     $recid = $val;
     $records{$recid} = {};
   } else {
     $records{$recid}->{$key} = $val;
   }

   if ($key eq 'DE') {
     $termtoid{$val} = $recid;
   }
 } else {
 }
}


bin anfänger, muss aber unbedingt wissen, was in dieser gewöhnungsbedürftigen Syntax vor sich geht.
Ich weiss, dass ich mit anderen Sachen anfangen sollte, aber es ist jetzt nicht zu ändern.

Das Skript bekommt eine Text-Datei über die Kommandozeile.
Es fehlt noch der Teil vom Skript, in dem die eingelesenen Daten in eine XML-Datei geschrieben werden.

soviel habe ich schon rausgefunden.

die erste Zeile setzt für "chomp" das Zeichen, was je Zeil abgeschnitten werden soll. Allerdings funktioniert das nur, wenn man das zweite Zeichen ("\x0a") raus nimmt. Sonst geht es nicht.

Ich verstehe vor allem nicht die Zeilen bis zur ersten IF-Anweisung.
Die Text Datei Die eingelesen werden soll hat ungefähr folgenden Format:

NR=3234
DE= Hund
AB= Napf%Katze%Tier
VW=.....
...
...
NR=3323
DE= Katze
...
...
...

Wäre nett, wenn mir jemand die Sachen kurz erklaeren koennte. Ich nehme mal an, dass es sich um reguläre Ausdrücke handelt?

Vielen Dank und Gruss
philo\n\n

<!--EDIT|philo|1130237534-->
renee
 2005-10-25 15:00
#59260 #59260
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Es setzt nicht nur das Zeichen fuer chomp, sondern fuer alles was mit dem Line-Input-Separator zu tun hat (siehe perldoc perlvar), z.B. das Einlesen der naechsten "Zeile" bei while(<>).

Was funktioniert denn nicht, wenn das \x0a noch darin steht?? Dann wird wohl dieses Zeichen wohl nicht am Ende der Zeile stehen...

%records ist ein Hash...

Wie schon richtig geraten hast, handelt es sich beim Rest ueberwiegend um Regulaere Ausdruecke. Dazu ganz lesenswert:

perldoc perlre
perldoc perlretut
perldoc perlrequick

http://regenechsen.de
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/
renee
 2005-10-25 15:04
#59261 #59261
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Grob gesagt, liest es die Datei aus und speichert die Eintraege in Hashes und Hash of Hashes - ist aber relativ umstaendlich geschrieben...

Zu Hash of Hash solltest Du mal perldoc perllol und Wiki:perldoc perlreftut lesen...
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/
murphy
 2005-10-25 15:26
#59262 #59262
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Hier mal eine "Uebersetzung" des Quelltextbeginns, falls das zum Verstaendnis hilft:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
$/ = "\x1f\x0a";    # setze das Eingabedatensatztrennzeichen
# auf die Hexadezimalbytesequenz 1f 0a

%records = (); # erzeuge Hash %records mit globalem Scope,
# initialisiere die Variable auf den leeren Hash
%termtoid = ();

my $recid = ""; # erzeuge Skalar $recid mit lexikalischem Scope,
# initialisiere die Variable auf den leeren String

while(<>) { # solange weitere Daten vorhanden sind, lies von STDIN
# oder der ersten automatisch geoeffneten Datei auf der
# Kommandozeile. Die eingelesenen Bloecke, die durch $/
# terminiert sind, werden jeweils in $_ gespeichert
chomp; # entferne $/ am Ende des gelesenen Datensatzes
s/\n([[:upper:][:digit:]])/ $1/g; # ersetze alle Vorkommen von einem
# Zeilenumbruch, gefolgt von
# (einem einzelnen Grossbuchstaben oder
# einer Ziffer) in $_ durch $(den
# Grossbuchstaben oder die Ziffer)
s/\n//g; # entferne alle Vorkommen von Zeilenumbruechen in $_

s/% /%/g; # ersetze alle Vorkommen von "% " in $_ durch "%"

if (/(..)=(.*)/) { # falls $_ die Form (zwei beliebige Zeichen)=(null
# oder mehr beliebige Zeichen) hat:
my $key = $1; # erzeuge Skalar $key mit lexikalischem Scope,
# initialisiere die Variable auf die $(Sequenz
# zweier beliebiger Zeichen) aus der Bedingungsabfrage
[...]


Es empfiehlt sich aber auf jeden Fall, zum tieferen Verstaendnis, die bereits genannten Teile der Perldokumentation zu lesen.

(edit: logischer tippfehler korrigiert)\n\n

<!--EDIT|murphy|1130239673-->
When C++ is your hammer, every problem looks like your thumb.
philo
 2005-10-25 16:01
#59263 #59263
User since
2005-10-25
2 Artikel
BenutzerIn
[default_avatar]
[quote=murphy,25.10.2005, 13:26]Hier mal eine "Uebersetzung" des Quelltextbeginns, falls das zum Verstaendnis hilft:

Es empfiehlt sich aber auf jeden Fall, zum tieferen Verstaendnis, die bereits genannten Teile der Perldokumentation zu lesen.

(edit: logischer tippfehler korrigiert)[/quote]
hallo,

vielen dank an alle die so schnell geantwortet haben. besonders der letzt beitrag war sehr aufschlussreich.

gruss
philo
<< >> 5 Einträge, 1 Seite



View all threads created 2005-10-25 14:51.