komischer Match

komischer Match

am 20.07.2006 18:35:45 von Thomas Barth

Hallo,

eine Textdatei enthält z.B. folgende Zeile

FN:Thomas Barth

Daraus moechte ich einen Dateinamen bilden.

if($line =~ /^FN:(.+?)$/) {
$outfile = "split/".$1.".vcf";
print $outfile ."\n";
}

Die Ausgabe von $outfile ergibt aber:
..vcft/Thomas Barth

und nicht, wie erwartet:

split/Thomas Barth.vcf

Hat jemand dafür eine Erklärung?

Thomas B

Re: komischer Match

am 20.07.2006 19:29:53 von Johannes Plunien

Hi Thomas,

> eine Textdatei enthält z.B. folgende Zeile
>
> FN:Thomas Barth

Deine Textdatei enthaelt (vermutlich, jedoch mit ziemlich grosser
Wahrscheinlichkeit :)) am Ende jeder Zeile noch ein unsichtbares ^M, was
einem \r entspricht (kannst du z.B. sehr schoen im vi sehen, wenn du
damit die Datei oeffnest). Dieses \r verursacht den 'komischen Match'.
Was da jetzt intern genau passiert:
\r bedeutet 'Wagenruecklauf', was soviel heisst wie 'gehe an den Anfang
der Zeile'. Dein Regulaerer Ausdruck matched ja alles nach dem 'FN:' bis
zum Zeilenende, was dieses \r ja mit einschliesst. In die Variable
$output speicherst du ja dann Folgendes:
'split/' . 'Thomas Bart\r' . '.vcf'
Heisst: Nach Thomas Bart geht er an den Zeilenanfang und fuegt dort das
'.vcf' ein.
Falls ich falsch liege mit meiner Vermutung, moege man mich bitte
berichtigen :)

> if($line =~ /^FN:(.+?)$/) {
> $outfile = "split/".$1.".vcf";
> print $outfile ."\n";
> }

Eine moegliche Loesung:

if($line =~ /^FN:(.+?)$/) {
$line =~ s/\r$//;
$outfile = "split/".$1.".vcf";
print $outfile ."\n";
}


Schoene Gruesse,
Johannes

Re: komischer Match

am 21.07.2006 09:57:42 von Thomas Barth

Johannes Plunien wrote:
> Hi Thomas,
>
>> eine Textdatei enthält z.B. folgende Zeile
>>
>> FN:Thomas Barth
>
> Deine Textdatei enthaelt (vermutlich, jedoch mit ziemlich grosser
> Wahrscheinlichkeit :)) am Ende jeder Zeile noch ein unsichtbares ^M, was
> einem \r entspricht (kannst du z.B. sehr schoen im vi sehen, wenn du
> damit die Datei oeffnest). Dieses \r verursacht den 'komischen Match'.
> Was da jetzt intern genau passiert:
> \r bedeutet 'Wagenruecklauf', was soviel heisst wie 'gehe an den Anfang
> der Zeile'. Dein Regulaerer Ausdruck matched ja alles nach dem 'FN:' bis
> zum Zeilenende, was dieses \r ja mit einschliesst. In die Variable
> $output speicherst du ja dann Folgendes:
> 'split/' . 'Thomas Bart\r' . '.vcf'
> Heisst: Nach Thomas Bart geht er an den Zeilenanfang und fuegt dort das
> '.vcf' ein.
> Falls ich falsch liege mit meiner Vermutung, moege man mich bitte
> berichtigen :)
>

Ja, es hing damit zusammen. Ich habe die einzulesende Datei mal vorher
mit dem sysutil fromdos konvertiert. Ich hatte eigentlich angenommen,
dass eine Anweisung wie chomp($line); das erledigen würde.

>> if($line =~ /^FN:(.+?)$/) {
>> $outfile = "split/".$1.".vcf";
>> print $outfile ."\n";
>> }
>
> Eine moegliche Loesung:
>
> if($line =~ /^FN:(.+?)$/) {
> $line =~ s/\r$//;
> $outfile = "split/".$1.".vcf";
> print $outfile ."\n";
> }
>

Gibt es noch die Möglichkeit, die Umlaute in den Treffern beizubehalten,
damit die Dateien auch so abgespeichert werden können?

Thomas B

Re: komischer Match

am 21.07.2006 11:04:16 von Michael Kindermann

Thomas Barth wrote:

> Johannes Plunien wrote:
>> Hi Thomas,
>>
>>> eine Textdatei enthält z.B. folgende Zeile
>>>
>>> FN:Thomas Barth
>>
>> Deine Textdatei enthaelt (vermutlich, jedoch mit ziemlich grosser
>> Wahrscheinlichkeit :)) am Ende jeder Zeile noch ein unsichtbares ^M, was
>> einem \r entspricht (kannst du z.B. sehr schoen im vi sehen, wenn du
>> damit die Datei oeffnest). Dieses \r verursacht den 'komischen Match'.
>> Was da jetzt intern genau passiert:
>> \r bedeutet 'Wagenruecklauf', was soviel heisst wie 'gehe an den Anfang
>> der Zeile'. Dein Regulaerer Ausdruck matched ja alles nach dem 'FN:' bis
>> zum Zeilenende, was dieses \r ja mit einschliesst. In die Variable
>> $output speicherst du ja dann Folgendes:
>> 'split/' . 'Thomas Bart\r' . '.vcf'
>> Heisst: Nach Thomas Bart geht er an den Zeilenanfang und fuegt dort das
>> '.vcf' ein.
>> Falls ich falsch liege mit meiner Vermutung, moege man mich bitte
>> berichtigen :)
>>
>
> Ja, es hing damit zusammen. Ich habe die einzulesende Datei mal vorher
> mit dem sysutil fromdos konvertiert. Ich hatte eigentlich angenommen,
> dass eine Anweisung wie chomp($line); das erledigen würde.
>
>>> if($line =~ /^FN:(.+?)$/) {
>>> $outfile = "split/".$1.".vcf";
>>> print $outfile ."\n";
>>> }
>>
>> Eine moegliche Loesung:
>>
>> if($line =~ /^FN:(.+?)$/) {
>> $line =~ s/\r$//;
>> $outfile = "split/".$1.".vcf";
>> print $outfile ."\n";
>> }
>>
>
> Gibt es noch die Möglichkeit, die Umlaute in den Treffern beizubehalten,
> damit die Dateien auch so abgespeichert werden können?
>
> Thomas B
Vielleicht hilft dir Encode bei den Umöauten weiter!

Gruss kimi

Re: komischer Match

am 21.07.2006 13:00:38 von Wolf Behrenhoff

Thomas Barth schrieb:
> Johannes Plunien wrote:
>> Hi Thomas,
>>
>>> eine Textdatei enthält z.B. folgende Zeile
>>>
>>> FN:Thomas Barth
>> Deine Textdatei enthaelt (vermutlich, jedoch mit ziemlich grosser
>> Wahrscheinlichkeit :)) am Ende jeder Zeile noch ein unsichtbares ^M,
>
> Ja, es hing damit zusammen. Ich habe die einzulesende Datei mal vorher
> mit dem sysutil fromdos konvertiert. Ich hatte eigentlich angenommen,
> dass eine Anweisung wie chomp($line); das erledigen würde.

chomp schneidet dir ab, was im Input-Record-Separator ($/) drinsteht.
Wenn dort nur ein \n steht, dann wird auch nur \n abgeschnitten. Wenn
deine Dateien immer von DOS kommen, kannst du natürlich einfach $/ so
setzen, dass es \r\n enthält - dann schneidet dir chomp beides Zeichen ab.

> Gibt es noch die Möglichkeit, die Umlaute in den Treffern beizubehalten,
> damit die Dateien auch so abgespeichert werden können?

Gegenfrage: Wo gehen denn bei dir Umlaute verloren?

Wolf