Schrift
[thread]7582[/thread]

Strings bearbeiten

Leser: 2


<< >> 7 Einträge, 1 Seite
tophoven
 2005-12-30 10:55
#61420 #61420
User since
2005-12-02
28 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen,

ich möchte aus einer Parameterdatei Werte auslesen. Die Werte in der Datei haben folgenden Aufbau:

   var1 = wert1
   var2 = wert2

Ich lese dann Zeile für Zeile aus und bearbeite den diese wie folgt:

   ($var, $wert) = split ( /\s=\s/, $line );

Leider ist diese Art der Bearbeitung unflexibel was die Anzahl der Leerstellen angeht. Wie kann ich dies hinbekommen, das die Anzahl der Leerstellen auch beliebig sein kann?

Besten Dank für Eure Hilfe

Gruß

Franz-Josef
Ronnie
 2005-12-30 11:26
#61421 #61421
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
[quote=tophoven,30.12.2005, 09:55]Ich lese dann Zeile für Zeile aus und bearbeite den diese wie folgt:
($var, $wert) = split ( /\s=\s/, $line );[/quote]
Code: (dl )
($var, $wert) = split ( /\s+=\s+/, $line );

Mit \s+ oder \s*
pq
 2005-12-30 16:25
#61422 #61422
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
oder einfach CPAN:Config::IniFiles
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
pKai
 2005-12-31 13:00
#61423 #61423
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
CPAN:Config::IniFiles mag es nicht, wenn man keinen Abschnitt ("[Name des Abschnitts]") definiert.
CPAN:Config:Std nimmt in dem Fall gnädigerweise einen "leeren" Abschnittsnamen ("[]") an.
Beide Module erlauben beliebige Leerzeichen vor und nach dem Trenner ("=") in jedem Eintrag.
I sense a soul in search of answers.
bloonix
 2005-12-31 15:22
#61424 #61424
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Hallo Franz-Josef,

[quote=tophoven,30.12.2005, 09:55]   ($var, $wert) = split ( /\s=\s/, $line );

Leider ist diese Art der Bearbeitung unflexibel was die Anzahl der Leerstellen angeht.[/quote]

... nicht nur das! Was ist mit Kommentaren? Was ist mit Leerzeilen?
Selbst eine Konfigurationsdatei sollte strukturiert aufgebaut und
dokumentiert sein. Wenn du dann mit split arbeitest, wirst du vorher
bestimmt mittels "next if /regexp/" die Schleife beeinflussen. Das könnte
man auch zusammen fassen ...

datei.cfg
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Kommentar = Kommentar
# Kommentar
 # Kommentar


name0=value0
name1   =value1
name2=   value2
name3   =   value3
  name4=value4
  name5   =value5
  name6=   value6
  name7   =   value7
  name8=value8   # Kommentar
  name9   =   value9#Kommentar


Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# aus ...

while (<FILE>) {
   chomp;
   next if /^(\s*#|\s*$)/; 
   s/\s*=\s*/=/;
   s/^\s*//;
   s/\s*#.*//;
   my ($name,$value) = split /=/, $_;
   $hash{$name} = $value;
}

# könnte man folgendes machen ...

while (<FILE>) {
   chomp;
   $hash{$1} = $2 if /^\s*(\w+)\s*=\s*(.+?)(\s*#|$)/;
}


-------------------------------
Edit:

Die 2. while-Schleife wird nicht korrekt angezeigt...

Code: (dl )
1
2
3
4
while (<FILE>) {
  chomp;
  $hash{$1} = $2 if /^\s*(\w+)\s*=\s*(.+?)(\s*#|$)/;
}

--------------------------------

Fisch dir einfach das aus der Konfigurationsdatei, was du brauchst.

Du kannst aber auch mit dem Config-Modul arbeiten.

Greez,
opi\n\n

<!--EDIT|opi|1136035590-->
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.
ptk
 2005-12-31 17:40
#61425 #61425
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
split() sollte höchstens zwei Argumente zurückliefern, dann kann man auch im Value ein Gleichheitszeichen unterbringen:
Code: (dl )
my ($name,$value) = split /=/, $_, 2;
steffenw
 2005-01-01 13:04
#61426 #61426
User since
2003-08-15
692 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=pKai,31.12.2005, 12:00]CPAN:Config::IniFiles mag es nicht, wenn man keinen Abschnitt  ("[Name des Abschnitts]") definiert.[/quote]
Dafür kann es mit dem "here document" umgehen. Das ist geil. Z.B.:
Code: (dl )
1
2
3
4
text = <<EOT
einfach Text
mit \n drin
EOT
Ich hatte das mal genutzt, um SQL-Statements vom Programm zu trennen.
$SIG{USER} = sub {love 'Perl' or die};
<< >> 7 Einträge, 1 Seite



View all threads created 2005-12-30 10:55.