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

CONF Datei in Assoziatives Array



<< >> 10 Einträge, 1 Seite
Andreas
 2004-04-20 15:50
#81686 #81686
User since
2003-09-24
111 Artikel
BenutzerIn
[default_avatar]
Hallo an alle,

ich hbae ein Script das sich die Parameter wie Pfade usw aus einer Confdatei holen soll, jetzt suche ich eine einfache Möglichkeit das zu tun. Folgendes steht in der CONF:

STAT_PATH C:\\perl\\abnahme
LOG_PATH C:\\perl\\abnahme
TIMER_STEP 3000

die Spalten sind mit einer unbestimmten Anzahl von Leerstellen getrennt, die Spaltenanzahl soll immer 2 sein (Parametername, Wert)

jetzt würde ich gerne so drauf zu greifen wie auf ein assoziatives Array, also irgenwie so:

$stat_path=$conf{'STAT_PATH'}

meine erste Frage dazu:

macht es überhaupt Sinn?

2.

Wie könnte ich auf diese Weise oder ähnliche auf eine solche Datei zugreifen?

Danke für eure Hilfe

Andreas
Knuddlbaer
 2004-04-20 16:07
#81687 #81687
User since
2004-04-13
32 Artikel
BenutzerIn
[default_avatar]
Bin selbst noch noob, aber vllt. geht das:


Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
my $fh;


 open $fh , "DeineDatei";

my $line;
my %conf;
  while($line = <$fh>)4
  {
       $line =~ /^(.*)\s*(.*)\s*$/
       $conf{$1} = $2;
  }


Das sollte Die alles vor dem ersten Leerzeichen als Key nehmen und alles bis zum Zeilenende (exklusiv leerzeichen vorm \n) als schlüssel


p.S.: Kommentare doer Ungültige Zeilen sind hier nicht berücksichtigt.\n\n

<!--EDIT|Knuddlbaer|1082462963-->
Andreas
 2004-04-20 16:28
#81688 #81688
User since
2003-09-24
111 Artikel
BenutzerIn
[default_avatar]
hi,
schaut schon mal gut aus.
Komm nur nicht ganz mit der Zeile zurecht:

$line =~ /^(.*)\s*(.*)\s*$/;


Habs jetzt auf die billige Weise versucht:




Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
my $fh;

open $fh , "REPSTAT.conf";

my $line;
my %conf;
while($line = <$fh>)
{
@a = split(/ +/, $line);
$conf{$a[0]} = $a[1];
}
print $conf{'LOG_PATH'}."\n";
ronald
 2004-04-20 17:08
#81689 #81689
User since
2003-08-15
76 Artikel
BenutzerIn
[default_avatar]
Noch stabiler ist es, wenn der split-Befehl nur 2 Werte liefert:
Code: (dl )
@a = split(' ', $line, 2);
\n\n

<!--EDIT|ronald|1082468034-->
tomlong
 2004-04-20 17:29
#81690 #81690
User since
2003-08-04
93 Artikel
BenutzerIn
[default_avatar]
oder schau dir mal das Modul Config::Simple an ... da kannste aus mehreren Standard-Configformaten direkt in ein Hash einlesen, bzw. das File natürlich auch bearbeiten
hth
Live long and prosper!
42;
Knuddlbaer
 2004-04-20 17:42
#81691 #81691
User since
2004-04-13
32 Artikel
BenutzerIn
[default_avatar]
[quote=Andreas,20.04.2004, 14:28]$line =~ /^(.*)\s+(.*)\s*$/;


Schau Dir aber das an was tomlong schreibt.
Kenne das nicht, aber das hört sich einfacher an :o)[/quote]
Das fällt unter Reguläre Ausdrücke.

Ich versuche mal zu erläutern und behebe gleich nen Fehler.
      $line =~ /^(.*)\s+(.*)\s*$/;
sollte
      $line =~ /^(.+)\s+(.+)\s*$/;

heissen

$line =~ bedeutet das der folgende Ausdruck auf $line angewendet werden soll.

Mit / begrenzt man einen Regulären ausdruck. (Wie die " bei einem string)

^ am Anfang bedeutet: Es muss am Zeilenanfang stehen
.+ bedeutet: Beliebigviele beliebige Zeichen (auch 1)
\s+ bedeutet: beliebigviele leerzeichen (min 1)
\s* bedeutet: beliebigviele leerzeichen, auch keines
$ bedeutet: zeilenende
() bedeutet: Das Resultat das auf den Ausdruck in der Klammer passt in $1 $2 .... $n speichern. Die Klammern werden von links nach rechts durchgezählt.


Der Ausdruck bedeutet:

Zeilenanfang gefolgt von mindestens 1 Zeichen gefolgt von mindestens 1 Leerzeichen gefolgt von mindestens 1 zeichen
gefolgt von eventuellen Leerzeichen gefolgt von einem \n\n\n

<!--EDIT|Knuddlbaer|1082470474-->
Crian
 2004-04-20 18:08
#81692 #81692
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
[quote=Knuddlbaer,20.04.2004, 15:42].+ bedeutet: Beliebigviele beliebige Zeichen (auch 0)[/quote]
Flasch:

.* beliebig viele, auch null, .+ 1 oder mehr


Für Configurationsdateien ist das erwähnte Paket wirklich zu empfehlen.\n\n

<!--EDIT|Crian|1082470224-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Knuddlbaer
 2004-04-20 18:15
#81693 #81693
User since
2004-04-13
32 Artikel
BenutzerIn
[default_avatar]
Argh!

thx, schon korregiert.

Das kommt bei raus wenn einem beim schreiben der Fehler auffällt und man nur die häfte berichtigt :o(


thx
Andreas
 2004-04-20 18:19
#81694 #81694
User since
2003-09-24
111 Artikel
BenutzerIn
[default_avatar]
Danke euch,

funktioniert soweit super, werde mir auch mal das Packet Config::Simple reinziehen.

Gruß Andreas
Crian
 2004-04-21 12:00
#81695 #81695
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
[quote=Knuddlbaer,20.04.2004, 16:15]Argh!

thx, schon korregiert.

Das kommt bei raus wenn einem beim schreiben der Fehler auffällt und man nur die häfte berichtigt :o(


thx[/quote]
Ich vermutete schon, dass Du das eigentlich wusstest, das Beispiel \s+ darunter hast Du ja richtig beschrieben, aber ich dachte mir, die Anmerkung wäre für andere Leser ev. wichtig.\n\n

<!--EDIT|Crian|1082534460-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
<< >> 10 Einträge, 1 Seite



View all threads created 2004-04-20 15:50.