|< 1 2 3 4 5 6 7 ... 10 >| | 93 Einträge, 10 Seiten |
1
2
3
4
5
6
if ($line =~ /\b(?:BLUBB|BLUBBER)\b/){
my $tmp = $1;
if ($tmp !~ /\bSAND\b/){
push @data,[@array];
}
}
1
2
3
4
Sabrina Gehring BLUBB 70854125
Anita Mueller BLUBB 78459614
Jens Meier BLUBBER 84578964
VAG SERVER SAND BLUBB
1
2
3
4
5
6
7
8
9
10
11
12
while(my $line = <FH>) {
chomp $line;
my @array = (split(/[\t\s\\]/,$line))[0..($columns-1)];
foreach (@array) {
s/^\s+/;/g; ##anfang
s/\s+/;/g; ##mitte
s/\s+$/;/g; ##ende
} # foreach
if($line =~ /\bBLUBB(?:ER)?\b/ and $line !~ /\bSAND\b/){
push(@data,[@array]);
}
} # while
1
2
3
4
Sabrina;Gehring;BLUBB;70854125
Anita;Mueller;BLUBB;78459614
Jens;Meier;BLUBBER;84578964
1
2
3
4
5
6
7
8
9
10
Frage:
Ich habe hier einige Codezeilen, die in zwei Schritten versuchen, etwas aus einem String herauszuziehen. Das erste Muster legt einen Teilstring in $1 ab, und dann durchsucht das zweite Muster $1 nach einem weiteren Muster. Das zweite Muster führt nie zu einer Übereinstimmung, und die Ausgabe von $1 zeigt, dass die Variable leer ist. Wenn diese Variable aber leer ist, so hätte das zweite Muster eigentlich gar nicht erst verglichen werden sollen. Was läuft hier falsch?
Antwort:
Das klingt, als wenn Sie ungefähr folgendes versucht hätten:
if ($string =~ /ein langes Muster mit einem {Teilmuster} darin/) { if ($1 =~ /ein zweites Muster/) { # verarbeitet zweites Muster }}
Leider geht das so nicht. Die Variable $1 (oder jede andere Variable) ist unglaublich kurzlebig. Jedesmal, wenn Sie einen regulären Ausdruck verwenden, setzt Perl alle Übereinstimmungsvariablen zurück. Bei diesem speziellen Beispiel hier gibt es in der ersten Zeile eine Übereinstimmung, und die Variable $1 wird mit dem Inhalt der Klammern gefüllt. Sobald Sie jedoch einen neuen Mustervergleich durchführen (in der zweiten Zeile), verschwindet der Wert von $1, was konkret bedeutet, dass das zweite Muster nie zu einer Übereinstimmung führen kann. Das Geheimnis liegt darin, sicherzustellen, dass die Werte aller Übereinstimmungsvariablen irgendwo anders abgelegt werden, wenn Sie wiederverwendet werden sollen. In diesem besonderen Fall reicht es aus, eine temporäre Variable hinzuzufügen und diese dann zu durchsuchen:
if ($string =~ /ein langes Muster mit einem {Teilmuster} darin/) { $tmp = $1; if ($tmp =~ /ein zweites Muster/) { # verarbeitet zweites Muster }}
1
2
3
4
5
6
open(OUTDATEN, ">ZIEL.txt") or die "Fehler beim oeffnen/anlegen: $!";
for my $entry(@data)
{
print OUTDATEN sprintf($format . "\n",@$entry); #ausgabe in datei
}
close (OUTDATEN)or die $!;
1
2
3
4
5
6
open(OUTDATEN, ">ZIEL.txt") or die "Fehler beim oeffnen/anlegen: $!";
for my $entry(@data)
{
print OUTDATEN join(';',@$entry),"\n"; #ausgabe in datei
}
close (OUTDATEN)or die $!;
|< 1 2 3 4 5 6 7 ... 10 >| | 93 Einträge, 10 Seiten |