Forum: PC-Programmierung Perl script ich komme nicht weiter


von g0nz00 (Gast)


Lesenswert?

Hallo,
Ich bin Perl anfänger und habe ein kleines tool geschrieben an folgender 
stelle habe ich probleme:

ich extrahiere aus einem Feld einen Namen den ich in $help speichere

Dann öffne ich ein cfg-File (txt) und suche in den zeilen $cfgline nach 
$help. steht noch mehr in der zeile.

Die Variable $ help habe ich mir anzeigen lassen und sie stimmt ganz 
genau, nur leider wird die if schleife if($cfgline =~ /$help/){} niemals 
ausgeführt.

$z soll später ein arrayplatz $array[$z] abfragen ob dort j oder n 
steht.
1
open(CONFIG,"$configfile") or die "Datei nicht gefunden $!\n";   # Datei öffnen        
2
        $z=0;
3
        $cfgline=();
4
        foreach $cfgline (<CONFIG>)    # zeile für zeile
5
          {
6
          if($cfgline !~ /#/)    # ist am anfang keine # mache ....
7
            {
8
            if($cfgline =~ /$help/)  # suche $help in der config
9
              {
10
              $z = $h;  # speichere  h in z
11
              $h++;
12
              }
13
14
            else 
15
              {
16
              
17
              $h++;
18
              }  
19
            }            
20
          }
21
                # rücksetzen der h variabel
22
        $help = ();      
23
        close CONFIG;

Für ein wenig hilfe bin ich sehr dankbar. suche jetzt schon 2 tage nach 
dem fehler und habe mir alles ausgeben lassen um einen hinweis zu 
finden.

Kenne leider keinen der Perl programmiert :(

Gruß

g0nz00

von Frank L. (florenzen)


Lesenswert?

g0nz00 wrote:

[...]
>           if($cfgline !~ /#/)    # ist am anfang keine # mache ....
[...]

Mein Perl ist ein wenig eingerostet, aber diese Anweisung mach nicht das 
was du dahintergeschrieben hast. So wie du das machst würde, sofern er 
das # überhaupt frißt, es an jeder Position innerhalt der Zeile matchen. 
Ich würde den Lattenzaun escapen und außerdem auf den Zeilenanfang 
matchen, also so: /^\#/
Das müßte sich wenn man !~ vermeiden will und stattdessen lieber =~ 
verwendet auch so ausdrücken lassen: /^[^\#]/

> Gruß
>
> g0nz00

gruß
frank

von Frank L. (florenzen)


Lesenswert?

Fast hätte ichs vergessen: chomp($help) hast du ausgeführt oder 
anderweitig sichergestellt?


gruß
frank

von g0nz00 (Gast)


Angehängte Dateien:

Lesenswert?

Das mit der # funtioniert tadellos

chomp $help habe ich auch schon eingebaut war eins der Fehler :(

Aber es geht immer noch nicht.

Das Programm gibt erst auf der Kommandozeile eine List.txt aus und soll 
die kommentare am anfang und ende ignorieren. (# ....).

Anschließend frage ich aus der Config.txt die userparameter ab und 
speichere sie in einem Feld mit j oder n.

Nach der dateiauswahl wird die entsprechende datei geöffnet und anhand 
der userparameter sollen einige passagen der txt-datei gelöscht werden.

weil sich die datei aus 3 teilen zusammen setzt habe ich ein feld #flags 
eingeführt die zur bearbeitung abgefragt werden.
1. Hast du applied gefunden dann setze das A-Flag und  dann schreibe 
erstmal in ein Feld und vergleiche mit userparameter wenn du 
end_of_applied gefunden hast. dann eventuel ausgabe des Feldes.

Es funktioniert auch alles ganz gut nur das er die variabel $help nicht 
in der config.txt findet. wenn ich einen der Userparameter in der $help 
= "gesuchtes_Word" definiere dann klapt es.

Es ist meine erstes Perl Programm und die Programmierung ist sehr 
"eigenwillig" aber vieleicht kann sich das ja mal jemand angucken wenns 
keine mühe macht ;)

Gruß

g0nz00

von g0nz00 (Gast)


Angehängte Dateien:

Lesenswert?

Sorry war eine uraltversion des progs

in der Auswahl geht nur der menüpunkt 1

gruß

g0nz00

von Ahem (Gast)


Lesenswert?

Ich finde auch Deine Ausdrucksweise sehr eigenwillig. Viele 
unvollständige Sätze. Eine Variable kann auch nicht Teil einer 
Text-Datei sein. Sie kann in einem Perl-Programm erscheinen. Aber 
solange es keine Meta-Datei zu einer Textdatei oder sowas gibt....

>Das Programm gibt erst auf der Kommandozeile eine List.txt aus und soll

eine <bestimmter Artikel, feminin: worauf bezieht der sich?) List.txt
>die kommentare am anfang und ende ignorieren. (# ....).
Am Ende von was oder wem?

>Anschließend frage ich aus der Config.txt die userparameter ab und
>speichere sie in einem Feld mit j oder n.
Aus einer Datei was abfragen? Wie soll das gehen? Du kannst höchstens 
Text aus einer Datei extrahieren.
Was für ein Feld? Mohrrüben? Oder was? Was soll das j oder n?

>Nach der dateiauswahl wird die entsprechende datei geöffnet und anhand
>der userparameter sollen einige passagen der txt-datei gelöscht werden.

Welche Auswahl? Wo und wann und durch wen oder was?

>weil sich die datei aus 3 teilen zusammen setzt habe ich ein feld #flags
>eingeführt die zur bearbeitung abgefragt werden.
Ein Feld, "die" abgefragt werden. Was soll das heissen? Schon 
grammatikalisch irreführend.

>1. Hast du applied gefunden dann setze das A-Flag und  dann schreibe
>erstmal in ein Feld und vergleiche mit userparameter wenn du
>end_of_applied gefunden hast. dann eventuel ausgabe des Feldes.
Wer ist Du? Was für ein A-Flag? Was für ein Feld? Welcher userparameter? 
Argv oder was? Was für ein end_of_pplied? Wo kommt das her?

>Es funktioniert auch alles ganz gut nur das er die variabel $help nicht
>in der config.txt findet. wenn ich einen der Userparameter in der $help
>= "gesuchtes_Word" definiere dann klapt es.
Was funktioniert? In einer Textdatei gibt es keine Variablen! Was soll 
das sein? Eine Variable wird durch auf sie ausgeführte Operationen 
nützlich (und kenntlich) In einer Textdatei steht einfahc nur "Text".


Am besten hilft Dir hier eine klare Problembeschreibung mit Beschreibung 
der Eingangsdaten und der daraus zu errechnenden Ausgangsdaten.

An der geringen Resonanz merkst Du das keiner was mit Deiner Frage 
anfangen kann.

von Tim (Gast)


Lesenswert?

hi!
Normalerweise gehört hinter
1
        foreach $cfgline (<CONFIG>)    # zeile für zeile
2
          {
ein
1
chomp($cfgline);
um den Zeilenumbruch am ende von $cfgline zu entfernen.

Der Regex
1
          if($cfgline !~ /#/)    # ist am anfang keine # mache ....
sollte so aussehen
1
          if($cfgline !~m/^#/)    # ist am anfang keine # mache ....
Sonst reicht eine # an beliebiger stelle in $cfgline....

Und hier
1
            if($cfgline =~ /$help/)  # suche $help in der config
bau doch mal ein m ein:
1
            if($cfgline =~m/$help/)  # suche $help in der config

von Ahem (Gast)


Lesenswert?

Vielleicht hilft es Dir weiter, wenn Du Deine Eingangsdatei auf das 
absolute Minimum reduzierst und auch das Perl-Programm resp. den 
regulären Ausdruck der da was matchen soll.

Dann sparst Du Dir lange Erklärungen und wir können auf Dein 
eigentliches Problem eingehen.

von Ahem (Gast)


Lesenswert?

Na, vielleicht auch nicht.
Merkwürdig.

von g0nz00 (Gast)


Lesenswert?

habe das alles auch schon probiert wenn ich if($cfgline =~ m/$help/) 
eingesetzt habe.

es ging alles so schön von der hand aber jetzt hänge ich seit tagen und 
finde den fehler nicht er gibt immer alles aus weil er nicht in diese if 
schleife springt. alle parameter ließt es richtig ein. die txt files 
werden abgearbeitet und an den gleichen positionen der felder stehen die 
richtigen j oder n`s in den userparametern. er findet nach dem 
herauskürzen der Parameter aber diese nicht in der Config.txt

habe das programm schritt für schritt geschrieben und immer wieder 
getestet ob er allles richtig übernimmt.

aber bei if($cfgline =~ $help) gehts nicht weiter

wenn ich mir $help ausgeben lasse dann steht dort

gesuchtes wort: NPS

und in der $cfgline: xxx NPS xxxx xxxx xxxx

aber er erkennt das nicht in der zeile.

Habe wirklich schon so viel probiert.

Gruß g0nz00

von Tim (Gast)


Lesenswert?

So, habe mir die 2. Perl.zip mal angeschaut....
"eigenwillig" kann ich bestätigen.

Ein parr anmerkungen zu:
1
        MARKE:        
2
        foreach  (<CONFIG>)    # zeile für zeile
3
          {print "$h\n";
4
          if($_ !~ /#/)    # ist am anfang keine # mache ....
5
            {
6
            if($_ =~ /LOGICAL/)  # suche $help in der config
7
              {
8
              print "in der schleife\n";              
9
              $zwerg = $h;  # speichere die i nummer des Feldes in zwerg
10
              print "zwerg = $zwerg\n";
11
              print "h= $h\n";              
12
              last MARKE;
$_ ist eine tolle Sache, macht den Code aber auch schwer lesbar.
das mit dem ^ im regex solltest du beachten
LOGICAL soll wohl $help heissen.

Ich habe dann Das Suchwort ist $help\n"; mal in ...ist \"$help\"... 
geändert und den chomp($help) reaktiviert. Die Ausgabe war:
1
"as Suchwort ist "ISOGEN_SKEY
Und jetzt ganz genau hinschauen! das 2. " in am ANFANG der Zeile!
Jetzt lass mich raten: Die stahlrohr_m.ptb ist unter Windof erstellt 
worden, richtig?
Der Windows-Zeilenumbruch besteht aus 2 Zeichen: \r und \n
Der unter Unix nur aus \n und chomp entfernt auch NUR \n....
Ergo ist der Inhalt von $help in warheit ISOGEN_SKEY\r
Und das findet Perl zurecht nicht.
Bau nach dem chomp mal ein
1
$help=~s/\r//;
ein. Oder davor
1
$help=~s/\r//g;
Das entfernt den \r nachhaltig.
Habe ich auch schon mal sehr lange nach sowas gesucht...

BTW: Perl kennt auch Arrays mit Strings als Index. Die nennt man dann 
Hash und sehen so aus:
$hash{"ISOGEN_SKEY"} = "j" oder z.b. if ($hash{$help} eq 'j'){ ....
Das dürfte um Längen schneller sein als xmal die config.txt zu laden
und das Programm wird auch wesentlich kürzer.
Geht natürlich auch mehrdimensional gemischt:
$lala{"hallo"}[45]{$test}{'noch einer'}[4]
Ein Zugriff auf den Gesammten Array 
$lala{"hallo"}[45]{$test}{'noch_einer'}
z.b. für eine foreach ist dann via 
@{$lala{"hallo"}[45]{$test}{'noch_einer'}} möglich :-)

von g0nz00 (Gast)


Lesenswert?

Vielen Dank Tim

es klappt wunderbar.

Oh man so ne kleine Sache und ich habe tagelang probiert.
Ja es wurde unter Windows erstellt das stahlrohr_m file.

Dann fehlt nur noch ein wenig Code für das restliche File und dann lüppt 
das alles ;)

nochmals vielen dank.

Gruß

g0nz00

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.