hoko
Goto Top

In Textdatei nach String suchen und diesen als Variable weiterverarbeiten

Hallo,

Ich möchte in einem Pelrscript eine Textdatei nach einem String durchsuchen und diesen dann weiterverarbeiten.
Der zu suchende Bereich ist vorne und hinten durch "#" begrenzt. Der Text wird anscheinend auch gefunden, aber ich bekomme als Ergebnis (TEXT1) aber nur 1 angezeigt.
Es sollte aber die Koordinate - in diesem Fall N50°06.44E008°40.30 als TEXT1 übergeben werden.


Hier mein Scriptentwurf
#!/usr/bin/perl
use utf8;
use strict;
use warnings;

open (FH, "meldung.txt");  
undef $/;
my $TEXT=<FH>;
if ($TEXT =~ /#(.+?)#/) {
print "Text gefunden"  
}
my $TEXT1 = $TEXT =~ /#(.+?)#/;
print $TEXT1;

close FH; 

Die Textdatei meldung.txt sieht in etwa so aus:
123445894
erfsafoaeierowuft9pastrhjw
e9ru234234
ierohwe8frhz0z8hrdf
dfhaodfh: #N50°06.44E008°40.30#
he8r0er

8erhz 2345r7´0

dhferz3r

Danke & Gruß
hoko

Content-ID: 251443

Url: https://administrator.de/contentid/251443

Ausgedruckt am: 22.11.2024 um 00:11 Uhr

colinardo
Lösung colinardo 09.10.2014, aktualisiert am 10.10.2014 um 12:45:13 Uhr
Goto Top
Hallo hoko,
aber ich bekomme als Ergebnis (TEXT1) aber nur 1 angezeigt.
Deine Zeile:
my $TEXT1 = $TEXT =~ /#(.+?)#/; 
macht ja nur einen Vergleich, der eben 1 (True) zurückliefert wenn ein Match gefunden wurde. Der Submatch wird bei jedem Vergleich in der Variablen $1 gespeichert, wobei 1 die Nummer des Submatches ist.

Für ein Pattern-Matching mit dem Submatch als Ergebnis kannst du es also so machen:
my $TEXT1;
if ($TEXT =~ m/#(.+?)#/) {
  $TEXT1 = $1;
  print $TEXT1;
}
oder wenn du nicht mit den globalen Variablen $x arbeiten willst lässt sich das Ergebnis auch direkt einer Liste zuweisen.
($TEXT1) = $TEXT =~ m/#(.+?)#/;
Du könntest damit auch so etwas machen:
($LAT,$LNG) = $TEXT =~ m/#([NS][^EW]+)([EW].+?)#/;
um Breiten- und Längengrad direkt separaten Variablen zu zuweisen.

Grüße Uwe
hoko
hoko 10.10.2014 um 10:21:43 Uhr
Goto Top
Hallo Uwe,

vielen Dank. Das leuchtet ein.

Wenn ich aber jetzt mehrere Teilen aus der Datei übergeben möchte:

my $FILE = "$ARGV";    # Datei wird beim Start mitgegeben  
open (FH, $FILE);
undef $/;
my $TEXT=<FH>;

my $TEXT1= $TEXT =~ /#(.+?)#/;
$TEXT1= $1;
print $TEXT1;

my $TEXT2= $TEXT =~ /110          :(.*)/;
$TEXT2 = $1;
print $TEXT2;

########################
#usw. mit diversen Abfragen. 

bekomme ich ja jedesmal nur $1 also die Koordinate als $TEXT1 und $TEXT2 angezeigt. Wird die nicht überschrieben oder
Kannst du mir sagen, wie ich das lösen kann?

Vielen Dank & Gruß
hoko
colinardo
Lösung colinardo 10.10.2014 aktualisiert um 12:45:18 Uhr
Goto Top
Zitat von @hoko:
Wenn ich aber jetzt mehrere Teilen aus der Datei übergeben möchte:
Dazu musst du den Modifizierer g = Global für den Regex Part verwenden und dann das Ergebnis einem Array zuweisen, welches du dann mit einer Schleife durchläufst.
Ohne den Modifizierer g wird ansonsten immer nur der erste gefundene Match zurückgeliefert.
@matches  = ($TEXT =~ m/#(.+?)#/g);
$i = 0;
while ($i <= $#matches){
  print "$matches[$i++]\n";  
}
$#matches liefert die Anzahl an Array-Elementen. Zur Arbeit mit Listen und Arrays siehe: http://www.perlboard.de/perlguide/Kap04.html
$matches[$i++] gibt das jeweilige Array-Element aus und inkrementiert in einem Schritt die Laufvariable $i++.

Grüße Uwe
hoko
hoko 10.10.2014 um 12:45:53 Uhr
Goto Top
Danke das war es.