Perl substring

Bash, Shell, PHP, Python, Perl, CGI
[monk]
Posts: 163
Joined: 2002-08-09 17:31
Location: Ulm

Perl substring

Post by [monk] »

Hallo,
ich verzweifel gerade ;o)

Normalerweiße programmiere ich alles in PHP das klappte auch bisher wunderbar.. Allerdings muss ich jetzt ein Script in Perl programmieren und verzweifle.

Ich brauche eine Funktion, das einen Substring auf vorhandensein prüft.

Mein String 1 sieht wie folgt aus: "Vorname="
Mein String 2 sieht wie folgt aus: "Vorname=Hans"

wie finde ich jetzt raus ob string 1 in string 2 ist ?

nachdem ich keine funktion dafür gefunden habe hab ich es mit regexp. versucht aber irgendwie will das noch nicht so richtig.

bisher habe ich:

if( $string1 =~ m/^$string2.*/ )

ich glaube es liegt am .*
Denn wenn die strings gleich sind dann findet er sie. Wie kann ich einen Wildcard hinsetzen ? ich dachte ein punkt ist ein beliebiges zeichen und der stern steht für beliebig oft.
sprich ein beliebiges zeichen beliebig oft.

ohh man das zeugs macht mich noch fertig =)


ich bedanke mich jetzt schon recht herzlich für antworten

Gruß

Michael
wgot
Posts: 1675
Joined: 2003-07-06 02:03

Re: Perl substring

Post by wgot »

Hallo Michael,

String1 in String 2:

$string2=~m/$string1/

String1 am Anfang von String2:

$string2=~m/^$string1/

Deine Lösung funktioniert auch, nur mußt Du string1 und string2 tauschen.

Vor dem =~m steht der String, der durchsucht wird, und dahinter steht, was gesucht wird.

Gruß, Wolfgang
[monk]
Posts: 163
Joined: 2002-08-09 17:31
Location: Ulm

Re: Perl substring

Post by [monk] »

Hallo Wolfgang,
das ist mir ehrlich gesagt schon peinlich. Ich kapier es einfach nicht. Die Abfrage reagiert einfach nicht darauf. es funktioniert nur, wenn die Zeilen 100%ig übereinstimmen. Sowohl deine als auch meine Lösung.

Ich werde morgen früh den code etwas abspecken und hier mal die zeilen posten. Entweder bin ich völlig dämlich oder aber Perl ist kaputt ;o)
wgot
Posts: 1675
Joined: 2003-07-06 02:03

Re: Perl substring

Post by wgot »

Hallo Michael,

denk Dir nix dabei, wenn's ein Stück aus längerem Code ist, ist vielleicht außenrum was faul. Kann's an Groß-/Kleinschreibung liegen?

Code: Select all

$string1='Vorname=';
$string2='Vorname=Hans';
$string3='vorname=Hans';

if ($string2=~m/^$string1/) { print "1 in 2 enthaltenn"; } else { print "1 in 2 nicht enthaltenn"; }
if ($string2=~m/^$string1.*/)  { print "1 in 2 enthaltenn"; } else { print "1 in 2 nicht enthaltenn"; }

if ($string3=~m/^$string1/) { print "1 in 3 enthaltenn"; } else { print "1 in 3 nicht enthaltenn"; }
if ($string3=~m/^$string1.*/)  { print "1 in 3 enthaltenn"; } else { print "1 in 3 nicht enthaltenn"; }

if ($string3=~m/^$string1/i) { print "1 in 3 enthalten ohne Beachtung Grossschreibungn"; } else { print "1 in 3 nicht enthalten ohne Beachtung Grossschreibungn"; }
if ($string3=~m/^$string1.*/i)  { print "1 in 3 enthalten ohne Beachtung Grossschreibungn"; } else { print "1 in 3 nicht enthalten ohne Beachtung Grossschreibungn"; }
liefert bei mir die erwarteten Ergebnisse.

Gruß, Wolfgang
[monk]
Posts: 163
Joined: 2002-08-09 17:31
Location: Ulm

Re: Perl substring

Post by [monk] »

Hallo Wolfgang,
zunächst will ich mich nocheinmal bedanken das du mir so hilfst.

Dein Code funktioniert bei mir auch einwandfrei. Ich wüßte aber nicht wo das Problem sonst sein sollte. Groß und Kleinschreibung kann nicht die Fehlerursache sein, da die Parameter exakt gleich sind. Die Dateien wurden voneinander kopiert und nur abgeändert. Leider aber gibt es inzwischen dateien, welche von dem "Muster" abweichen, da die Musterdatei mit der Zeit immer wieder ergänzt wurde.

Ich hab mein Script jetzt mal abgespeckt. Ich wüsste aber nicht wo da der Fehler ist. Entweder hab ich wirklich Tomaten auf den Augen oder aber ich sollte bei PHP bleiben *g*

Code: Select all

#!/usr/local/bin/perl

open(MUSTER,"mustermann.txt");
	while ( $zeile = <MUSTER> )
	{
		$feld = TesteEintrag($zeile,"musterfrau.txt");

		if( $feld =~ m/^$zeile/ ){
			print "drin";
		}
		else {
			print "net drin";
		}
	}
close(MUSTER);


sub TesteEintrag{
	$rueckgabe = "";
	open(DATEI, $_[1]);
	while ( $i = <DATEI> )
	{
		if( $i =~ m/^$_[0]/ ) {
			$rueckgabe = $i;
		}
	}
	close(DATEI);
	return $rueckgabe;
}
wgot
Posts: 1675
Joined: 2003-07-06 02:03

Re: Perl substring

Post by wgot »

Hallo Michael,

schluck - daran bin ich auch mal ewig gesessen. :cry:
Perl hat schon ein paar wirklich gemeine Fallen!

$zeile=<MUSTER>;

liest die ganze Zeile aus der Datei; wirklich die ganze, mit der Zeilenendekennung. Also das gleiche Ergebnis wie $zeile="Vorname=n";

Zum Abtrennen der Zeilenendekennung gibt's chomp:

Code: Select all

while (chomp($zeile=<MUSTER>))
oder übersichtlicher

Code: Select all

while ($zeile=<MUSTER>)
  {
    chomp $zeile;
    ....
  }
Chomp in Perl unter Windows versucht rn abzutrennen, in Perl unter Linux nur n. Wenn nicht vorhanden, bleibt die Zeile unverändert.

Gruß, Wolfgang
[monk]
Posts: 163
Joined: 2002-08-09 17:31
Location: Ulm

Re: Perl substring

Post by [monk] »

Hallo Wolfgang,
ich danke dir recht herzlich. Es funktioniert *freu*.

Mir wurde das auch erst klar wo ich es mir in der Form aufgeschrieben hab. Hab zunächst rätseln müssen wo da der unterschied sei ;o)

Code: Select all

$string1 = "Name=Hansn";
$string2 = "Name=n"
Ã?ble Falle sag ich nur ;o)