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

$/ Windows/Linux Zeilenumbruch



<< >> 2 Einträge, 1 Seite
Froschpopo
 2007-09-06 23:28
#99160 #99160
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Ich matche in einer Datei:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
open WORDS, "/srv/www/kukla/words.txt"
or die $!;
my @words = <WORDS>;

my $found = 0;
for my $word (@words) {
chomp $word;
$word = quotemeta($word);
$found = 1 if $msg =~ /$word/;
}

print "Ergebnis: $found\n";


Nun habe ich folgendes:
Wenn ich die Datei mit Linux erstelle, dann matched er korrekt.
Wenn ich die Datei aber mit Notepad unter Windows erstelle, dann bleibt $found immer 0.
Ich habe mittlerweile irgendwie schon den Verdacht, dass es am Zeilenumbruch liegt.
Was würdet ihr mir nun vorschlagen?
Linuxer
 2007-09-07 00:00
#99163 #99163
User since
2006-01-27
3875 Artikel
HausmeisterIn

user image
Wenn das Skript unter Linux läuft, würde ich schon im WinDOS darauf achten, dass die Linebreaks entsprechend gesetzt werden.
Spätestens beim Übertragen (FTP ascii mode) kann man das säubern.
Ansonsten hilft die Verwendung von recode auf der Kommandozeile.

Oder man baut sich einen entsprechenden Code ins Skript, der z.B. anhand von des unbehandelten $words[0] bestimmt, welcher Umbruch vorliegt und anschliessend in einem Block eine lokalisierte Variable $/ entsprechend setzt, um dann chomp aufzurufen; Schema mit anteiliger Denksportaufgabe (TODO):

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/usr/bin/perl
# vi:ts=4 sw=4 et:
use strict;
use warnings;

my $msg = "Mein Auto ist defekt, darum nutz ich das fahrrad.";

my @words = <DATA>;

# TODO: am Zeilenende darf kein normales Leerzeichen, Tab, o.ä. auftauchen
# man sollte \s auch durch die passenden Hex- oder Octal-Werte in einer Klasse ersetzen
if ( $words[0] =~ m/(\s+)$/ ) {
local $/=$1;
chomp @words;
}

my $found = 0;
for my $word (@words) {

$word = quotemeta($word);
$found = 1 if $msg =~ /$word/;
}

print "Ergebnis: $found\n";


__DATA__
Auto
Fahrrad
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
<< >> 2 Einträge, 1 Seite



View all threads created 2007-09-06 23:28.